Case classes match (and do their other nifty things) only on the first set of parameters:
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
If it's not a case class, you can define the unapply to be anything you want, so it's really up to the implementer of the class. By default, there is no unapply, so you can match only on the type.
If you want to use the nifty case class features including being able to match and do equality on everything, but have some sort of division, you could nest case classes:
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