Why does this Scala code fail to typecheck? trait T { type A } trait GenFoo[A0, S <: T { type A = A0 }] trait Foo[S <: T] extends GenFoo[S#A, S] I don't understand why "type arguments [S#A,S] do not conform to trait GenFoo's type parameter bounds [A0,S <: T{type A = A0}]". Is there a work-around? Edit : As has been pointed out, the conformance error stems from the failure to verify S <: T{type A = S#A} . Daniel Sobral pointed to -explaintypes , which tells us: S <: T{type A = S#A}? S <: T? true S specializes type A? this.A = this.A? S = this.type? false false false false I'm not sure how to