A lot of people have difficulty understanding type-classes. This has a lot more to do with the context of type-classes than type-classes themselves; Haskell, the foremost language with type-classes, also includes more complicated concepts enabled by type-classes. People often conflate these concepts with type-classes themselves.
Type-classes in Scala are similarly conflated with more complicated concepts and have the added detriment of being a pattern rather than a language feature.
In this post I'll explain type-classes by relating them to somehting everybody understands: the List interface in Java.
public interface List<E> {
public E get(int index) = ...
public int size() = ...