I make a basic npc, which handles all the common people that are around and don't really say much. It gets a var that states what it will say (usually a list for randomized messages). For the basic shopkeeper, I do pretty much the same thing but the list is for items it sells. They handle probably 70-90% of my npcs while the remainder are more specialized versions for say, quest people or shops with special qualities like only open at certain times or trade for certain things. These may have many different conversation paths or tasks to do than doing just one simple thing. They have their own procs and vars, while I still try to retain as many of the qualities of the basic npc, to handle this.

Generally what type of NPC it is would depend on the type that I use for it. If it's movable, it's a type of /mob/NPC, if it's non-movable, it's a type of /obj/NPC. Then I break down. If it's a type of /mob/NPC, I try to figure out of AI is required. If AI is required, I create a special datum to handle the tasks. If AI isn't required, I just let the NPC sit there and move a bit. ( When I say AI, I mean it actually performs action A when action B is performed. )

Of course, objs could be used as well as the moving type, almost interchangeably. Almost. They are, after all, both derived of /atom/movable ... though each is still unique. It's all a matter of what you want, and what you need.