When overriding Block.isBlockReplaceable to return true, players can only replace the blocks if the block's material is also a "ground cover" material (currently snow, vine, water, lava or fire). The following change to Block.java fixes this: (line 888 in Forge 295)
public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
{
int var5 = par1World.getBlockId(par2, par3, par4);
- return var5 == 0 || blocksList[var5].blockMaterial.isGroundCover();
+ return var5 == 0 || blocksList[var5].blockMaterial.isGroundCover() || blocksList[var5].isBlockReplaceable(par1World, par2, par3, par4);
}