From ArrayList to List[A] is a cool step, but what if you want to define something generic over the container, a L[A] : Foldable where L could be a List[A] or a Tree[A] or a IO[A] action, as long as they implement Foldable.
Then if they implement Foldable you can access lots of std lib things that require a Foldable (or Traversable or Functor or whatever)
It gives you a lot of abstractive power to be able to write operations in terms of Foldable or other HKTs and then share them among many specific instances.
It's sort of like being able to define things like Iterable or IEnumerable but from a polymorphism perspective rather than an inheritance one.