Why does Scala have path-dependent types?
The Scalable Component Abstractions paper has a good explanation on path dependent types and also a good example in Section 3: "Case study: subject/observer".
This paper explains it nicely. Basically, they're used to support abstract data type based programming and modularization.