I agree that in most cases, simplicity versus complexity is a good strategy if your simplicity is not too short-sighted (Herms link, write the code in such a way that you can easily regroup later).
However, I also know how difficult it is to plug this error in the ear, which encourages a more thorough design. If you still want to approve inheritance without thinking in terms of “base class” and “subclass”, you can simply define the interface (for example, IProcessWatcher) that ProcessWatcher implements. When you use a ProcessWatcher object, refer to it from an interface point of view, so that if you later decide to create a BrowserWatcher (or any other kind of ProcessWatcher), you can do this without forcing it to go down from the ProcessWatcher if it implements the IProcessWatcher interface.
Warning: Be careful. It's tempting to want to define an interface for each individual object, and let it run into it, it's just ridiculous. =)
Ultimately, you need to find something you are comfortable with, since you will have to maintain this code, and I think this can be a pleasant compromise, and not just “Inheritance or lack of inheritance”.
Good luck
source share