Yet another difference is that with a self type, the SomeClass bound is only visible within the body of SomeTrait2, but not from the outside:
scala> implicitly[SomeTrait <:< SomeClass]
res0: <:<[SomeTrait,SomeClass] = <function1>
scala> implicitly[SomeTrait2 <:< SomeClass]
<console>:14: error: Cannot prove that SomeTrait2 <:< SomeClass.
implicitly[SomeTrait2 <:< SomeClass]
^