Case classes in Scala automatically add attributes as members, methods for equals, hashCode and toString, and pass attributes through the constructor with public access. Pattern matching in Scala allows matching on types using case classes and the underscore "_" wildcard, and improves functions by allowing matching of different data types.