Let\'s say I have a type hierarchy:
trait Root { type Self <: Root } class A extends Root { type Self <: A } class B extends A { type Self <: B }