¿Qué tiene de especial la palabra clave 'return'?

Cuando parecía entender qué es el retorno en Haskell, intenté jugar con diferentes alternativas y parece que el retorno no solo se puede usar en cualquier parte de la cadena de mónadas, sino que también se puede excluir por completo.

*Main> Just 9 >>= \y -> (Just y) >>= \x -> return x
Just 9

*Main> Just 9 >>= \y -> (return y) >>= \x -> (Just y)
Just 9

*Main> Just 9 >>= \y -> (Just y) >>= \x -> (Just x)
Just 9 

Incluso si omito el retorno en mi propia instancia, solo recibo una advertencia ...

data MaybeG a = NothingG | JustG a deriving Show 
instance Monad MaybeG where  
    --    return x = JustG x  
        NothingG >>= f = NothingG  
        JustG x >>= f  = f x  
        fail _ = NothingG  

Monad.hs:3:10:
    Warning: No explicit method nor default method for `return'
    In the instance declaration for `Monad MaybeG'

y todavía puedo usar la mónada

*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (JustG y)
JustG 9

*Main> JustG 9 >>= \y -> (NothingG) >>= \x -> (JustG y)
NothingG

Entonces, ¿qué tiene de especial la palabra clave return? ¿Se trata de casos más complejos donde no puedo omitirlo? ¿O porque esta es la forma "correcta" de hacer las cosas, incluso si se pueden hacer de manera diferente?

ACTUALIZAR: .. u otra alternativa, podría definir mi propio constructor de valor monádico

finallyMyLastStepG :: Int -> MaybeG Int
finallyMyLastStepG a = JustG a  

y producir otra variante de la misma cadena (con el mismo resultado).

*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (finallyMyLastStepG y)
JustG 9

Respuestas a la pregunta(3)

Su respuesta a la pregunta