Removing clouds also removes the below object in cloud edges. If this is not the case you can use an image of same coverage area with no cloud day and apply a good difference algorithm.
I am not an expert on this, but since I am dealing exactly with the same issue, my experience might be of some help. In general, you want to generate a mask that will remove not only clouds, but also cloud-shadows. I have explored options and there are many, ranging from performing an un-supervised classification of your image to then group together all classified-areas you know are cloud and cloud shadow to build a mask. The negative side of this, I guess it is quite arbitrary where in your classes you say there is no more cloud shadow. There are more complex algorithms that use reflectance in Lansat Band 1, blue, thermal and the metadata of your image to build a mask for your specific image. Out of the many, I am using the one Kwame Oppong Hackman mentions. You can check it out at https://code.google.com/p/fmask/. So far, it worked amazingly well to build a mask that clearly identified clear pixel land, clear water pixel, cloud and cloud shadow (it IDs snow as well, but I don’t have any). The only mistake I have seen so far is that I work in an area by the ocean and it seems like it is masking-out also areas of pure sand, which are just along the beach. Also I was not able to run the stand-alone version of the code, so I am running it in MatLAB, which is not free and requires some knowledge of coding.