Oi Paulo, na verdade elas são bem diferentes. A single tem mais a ver com a annotation @Stateless. Quando vc anota alguma classe com @Stateless, o container instancia alguns objetos dela e fica compartilhando os mesmos entre todos os pontos do seu sistema que vc pedir a injeção. O singleton é como se fosse um Stateless, só que você deixa claro para o servidor de aplicação que vc quer apenas 1 instância dele na memória.
Quando vc marca alguma classe com @Stateful, quer dizer que cada vez que um objeto dessa classe for solicitado, o servidor vai garantir que durante aquele intervalo de tempo outro objeto não utilize o mesmo. Stateful vem de manter estado com que solicitou o objeto.
Um erro muito comum, é achar que stateful pode ter atributos enquanto que stateless ou singleton não.. Todos podem, a diferença é a maneira que o servidor de aplicação lida com esses objetos.