Por que os objetos de caso são serializáveis e as classes de caso não?

Estou brincando com esse exemplohttp://scala.sygneca.com/code/remoteactors para aprender como os atores remotos funcionam no Scala (2.8.0). Em particular, modifiquei levemente como as mensagens enviadas pelos atores são definidas da seguinte forma:

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

e tudo funciona como esperado. Infelizmente, se eu definir os eventos como classes de caso, em vez de objetos de caso, como em:

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

meu exemplo para de funcionar. Em mais detalhes, parece que, enquanto os objetos de caso são serializáveis, as classes de caso não são. De fato, quando tento executar meu exemplo com essa última modificação, recebo a seguinte exceção:

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)

Existe uma razão pela qual os objetos de caso podem ser serializados e as classes de caso não? Existe uma maneira de fazer meu exemplo trabalhar com classes de caso também?

Editar: como sugerido por Victor e confirmado por Aaron Estou enviando o objeto complementar como mensagem em vez da classe. Além disso, inspecionando o código compilado com javap, parece evidente que enquanto a classe é serializável:

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

o objeto complementar não é:

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

Agora, a pergunta é: como posso especificar que quero usar a classe em vez do objeto complementar? Também adicionei um par de parênteses vazios quando envio a mensagem, conforme sugerido por Aaron, como em:

pong ! Ping()

mas nada mudou. No final, também adicionei um parâmetro falso à classe de caso

case class Ping(i: Int) extends Event

enviando a mensagem como:

pong ! Ping(0)

mas sem experimentar nenhuma diferença ainda. Alguma sugestão?

questionAnswers(2)

yourAnswerToTheQuestion