After looking into the Ender IO painter's code, I've discovered that they use:
public static boolean shouldHaveModel(Block block) {
if(block == null) {
return false;
}
return block.getDefaultState().getRenderType() == EnumBlockRenderType.MODEL;
}
If this method returns false, then the block is considered to be able to be used as a paint source.