Depends on your own personal opinion. There is no clear rule.
I would, personally, create an abstract class if 2 top-level classes share the same code for more then one method.
And I use interfaces...