Here are some things I usually follow when developing games - based on my opinion, not rules or anything like that:
-
Variety is key. You can have a game with only 4 types of enemies, if they vary enough what they do. See the TMNT games.
-
Make different level entry animations - a great example is Foot Soldiers or any Konami game. Avoid the engine's native spawn (where enemies fall from the sky) - you can even use this on one or the other enemy, but using it on everyone makes the game feel cheap and lazy.
- Color variations are important, they help that enemies don't look like simple copies. If possible, different names (alias) also help.
- When I put color variations, I always try to put some different attack, that only that color variation will do. In the Avengers game this happens constantly and you can solve it with a simple script. See the attack below - only if the enemy is using the green color it use it:

- I like to try to match the enemy's style to the stage. I find it strange that
you are in a bar and an enemy appears dressed in a karate kimono, and vice versa.
-
Make the player feel that there is progression in the game. Place fewer enemies at the beginning of the level, more enemies towards the end. And, over time, change which enemies appear in the stages - you don't have to (and shouldn't) place the same enemy throughout the game.
- Subbosses give this feeling of progress, for example Andore in Final Fight. And he doesn't show up all the time.