Diferencia entre @Stateless y @Singleton

estoy siguiendoeste tutorial que también utiliza un EJB:

package exercise1;

import java.util.Random;
import javax.ejb.Stateless;
import javax.inject.Named;

@Stateless
public class MessageServerBean {
    private int counter = 0;

    public String getMessage(){
        Random random = new Random();
        random.nextInt(9999999);
        int myRandomNumber = random.nextInt();
        return "" + myRandomNumber;
    }

    public int getCounter(){
        return counter++;
    }    
}

Aquí hay un ejemplo de salida:

Hola de facelets
El mensaje es: 84804258
El contador es: 26
Message Server Bean es: exercise1.MessageServerBean@757b6193

Aquí está mi observación:

Cuando coloco el bean como@Stateless Siempre obtengo el mismo ID de objeto y el contador siempre aumenta.Cuando coloco el bean como@Stateful Obtengo una nueva instancia cada vez que actualizo la página.Cuando lo puse a@Singleton Obtengo los mismos resultados que cuando lo puse a@Stateless: mismo ID de objeto, incremento de contador.

Entonces, lo que realmente me gustaría entender es: ¿cuál es la diferencia entre@Stateless y@Singleton EJBs en este mismo caso?

Respuestas a la pregunta(2)

Su respuesta a la pregunta