It depends on what the AI actually is. When I wrote my Pacman game (see blog) - most of these games are experimental learning not actually trying to produce the game so to speak - I wrote the game so there was a single object type which represented the Pacman and Ghosts, and they had different code for deciding what to do - either code that accessed the keyboard, or code that did directional checks etc.
The way I did this is to have a text instance variable which was an enemyType and use this to call a function indirectly with the UID as a parameter (e.g. FunctionlCall("AIFunc" & Object.enemyType,Object.UID). Functionality can then be arbitrarily applied to any of the object types (enemies in your case) by changing that instance variable.
In something like your enemy movement where there may be minor variations but very similar AI, it might be worth have a couple of additional parameters as instance variables "modifier1" "modifier2" passed in the call, so that you can reuse AI functionality that is similar but slightly different .