I don't quite see your concern about this class knowing by it's children. It looks fine to me.

Perhaps document in the class Javadoc that the constructors are intentionally package-scope so clients cannot create mutable classes that extend this class.