Does type signatures not help in that case?
(do x <- pure 1 y <- pure 5 pure (x + y)) :: Maybe Int
This is a known and discussed problem, so I'll refer you to the article usually reference around this issue: https://wiki.haskell.org/Do_notation_considered_harmful
flip runStateT s $ do ...
If I have to add an explicit annotation to a do block it's simple enough to separate it into another function.
justSix :: Maybe Int justSix = do x <- pure 1 y <- pure 5 pure (x + y)
This is a known and discussed problem, so I'll refer you to the article usually reference around this issue: https://wiki.haskell.org/Do_notation_considered_harmful