¿Por qué los objetos de caso son serializables y las clases de caso no?

Estoy jugando con este ejemplohttp://scala.sygneca.com/code/remoteactors para aprender cómo funcionan los actores remotos en Scala (2.8.0). En particular, modifiqué ligeramente la forma en que los mensajes enviados por los actores se definen de la siguiente manera:

sealed trait Event extends Serializable
case object Ping extends Event
case object Pong extends Event
case object Quit extends Event

Y todo funciona como se esperaba. Desafortunadamente, si defino los eventos como clases de caso en lugar de objetos de caso como en:

sealed trait Event extends Serializable
case class Ping extends Event
case class Pong extends Event
case class Quit extends Event

mi ejemplo deja de funcionar. Más detalladamente parece que mientras los objetos de caso son serializables, las clases de caso no lo son. De hecho, cuando intento ejecutar mi ejemplo con esta última modificación, obtengo la siguiente excepción:

scala.actors.remote.DelegateActor@148cc8c: caught java.io.NotSerializableException: scalachat.remote.Ping$
java.io.NotSerializableException: scalachat.remote.Ping$
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
    at scala.actors.remote.JavaSerializer.serialize(JavaSerializer.scala:46)
    at scala.actors.remote.NetKernel.namedSend(NetKernel.scala:38)
    at scala.actors.remote.NetKernel.forward(NetKernel.scala:71)
    at scala.actors.remote.DelegateActor$anonfun$acthttp://scala.sygneca.com/code/remoteactors$anonfun$apply$1.apply(Proxy.scala:182)
    at scala.actors.remote.DelegateActor$anonfun$acthttp://scala.sygneca.com/code/remoteactors$anonfun$apply$1.apply(Proxy.scala:123)
    at scala.actors.ReactorTask.run(ReactorTask.scala:34)
    at scala.actors.ReactorTask.compute(ReactorTask.scala:66)
    at scala.concurrent.forkjoin.RecursiveAction.exec(RecursiveAction.java:147)
    at scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.java:340)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:325)

¿Hay alguna razón por la cual los objetos de caso se puedan hacer serializables y las clases de caso no? ¿Hay alguna manera de hacer que mi ejemplo funcione con clases de casos?

Editar: según lo sugerido por Víctor y confirmado por Aaron, estoy enviando el objeto complementario como mensaje en lugar de la clase. Además, al inspeccionar el código compilado con javap, parece evidente que mientras la clase es serializable:

public class scalachat.remote.Ping extends java.lang.Object implements scalachat.remote.Event,java.io.Serializable,scala.ScalaObject,scala.Product

el objeto complementario no es:

public final class scalachat.remote.Ping$ extends scala.runtime.AbstractFunction0 implements scala.ScalaObject

Ahora la pregunta es: ¿cómo puedo especificar que quiero usar la clase en lugar del objeto complementario? También agregué un par de paréntesis vacío cuando envié el mensaje sugerido por Aaron como en:

pong ! Ping()

Pero nada ha cambiado. Al final también agregué un parámetro falso a la clase de caso

case class Ping(i: Int) extends Event

enviando el mensaje como:

pong ! Ping(0)

pero sin experimentar ninguna diferencia todavía. ¿Cualquier sugerencia?

Respuestas a la pregunta(2)

Su respuesta a la pregunta