Refactoring class hierarchy into ADT

A couple of questions /suggestions.

  1. Why is SimpleTypeD an abstract class instead of a trait?
  2. Do you really need constructors for the implementations? You can juts put all the arguments as abstract val / def that are overridden by the case classes.
  3. About terminology, I would call the traits / abstract classes that contain the implementation of the case classes FooImpl because even if abstract they contain the implementation; also remember to make them private to the package, and use self-types to ensure you do not mix or expose them.