Классы дел совпадают (и выполняют свои другие изящные действия) только по первому набору параметров:
scala> case class A(i: Int)(j: Int) { }
defined class A
scala> A(5)(4) match { case A(5) => "Hi" }
res14: java.lang.String = Hi
scala> A(5)(4) == A(5)(9)
res15: Boolean = true
Если это не класс case, вы можете определить unapply как что угодно, так что это действительно зависит от реализатора класса. По умолчанию отмены нет, поэтому можно сопоставлять только по типу.
Если вы хотите использовать отличные функции класса case, включая возможность сопоставления и равенства на всем, но с некоторым типом деления, вы можете вкладывать классы case:
case class Time(hour: Int, minute: Int, second: Int) { }
case class Date(year: Int, month: Int, day: Int) { }
case class DateTime(date: Date, time: Time) { }
scala> val dt = DateTime(Date(2011,5,27), Time(15,21,50))
scala> dt match { case DateTime(Date(2011,_,_),Time(h,m,50)) => println(h + ":" + m) }
15:21