Olá,
Eu já tive esse problema, estava utilizando JBoss.
O que acontece é o seguinte:
(atenção! não li isso em documentação, foi só o que observei na prática, portanto pode não estar 100% exato)
A JVM por algum motivo carrega duas vezes essas classes de entidades, que estão em ambos os EAR’s
(Talvez seja um bug no ClassLoader do JBoss, afinal só existe um Classloader e portanto devia carregar uma vez só cada classe)
De um jeito meio grosseiro, ficam existindo duas classes para cada entidade… A camada Web trabalhando com uma, e o EJB com outra… o que é muito maluco por sinal, o servidor cria uma espécie de “irmã gêmea” para esta classe de entidade, que embora seja igual na verdade não é a mesma… 
E aí vem o erro, quando transfere um objeto de uma camada para outra (por exemplo, EJB retornando uma pesquisa para Web), o servidor em algum momento faz Cast para a classe gêmea. Ela não é a mesma e por isso dá ClassCastException.
Como eu disse, é apenas uma observação prática, não me pergunte por que acontece!
A solução é retirar essas entidades do pacote Web, deixa só no EAR do EJB. Na hora da execução a camada Web consegue utilizar normalmente, já que a classe foi carregada antes, e fica existindo uma só, sem a gêmea malvada para atrapalhar.