Having alot of unique entities in a game will make a game stand out as interesting and fun. Unfortunately there is never quite enough time to develop as much as you would like, so it is worthwhile to find ways to vary existing entities sufficiently with as minimal a change as possible.
It doesn't take a significant change to make an entity feel different and provide a different play experience. Enemies for example can be varied with an artwork change, and some small behavioural changes. Changing a texture, adding a simple variation of firing pattern, and changing projectile graphics will effectively create a new enemy while keeping the majority of the code reusable.
There are lots of clever ways to design and code your game entities to allow code re-use and provide variations, but at the end of the day a simple old 'if' placed here and there in the code is often the most effective and flexibile solution. It's not worth abstracting every piece of behaviour and functionality, just keep the code simple and clean, and branch in the right places to make your entities new and interesting.
Game objects should be kept standalone where possible, so that they may be used in various places. When creating new entities, it can be very useful to just reuse some existing entity as a placeholder to get a feel for behaviour. This can be particularly useful for bosses, and designers will often ask things like 'can you make the boss shoot the foo-enemy bombs at this point?'. Bits and pieces of your game entities will end up in places you do not expect, so make sure everything is usable as standalone as possible.
And if all else fails, copy and paste it all. It's all going to change anyway, right? :)