
I would say that the 'bug' is that Data.Array.ST does not export ST.
GHC's policy is to report error messages in the same vocabulary as the user would use. Even though you have imported Control.Monad.ST.Lazy and Data.Array.ST, you can still say "ST" unambiguously, because Control.Monad.ST.Lazy exports ST, but Data.Array.ST does not -- so there's only one ST in scope.
If you imported only Data.Array.ST you wouldn't be able to mention "ST" at all.
If Data.Array.ST exported ST, the error message would give a qualified name for the ST constructor -- qualified by one of its import modules, that is.
I'll ask Simon M if we should export a bit more from Data.Array.ST, but actually I think the compiler is behaving right. It'd be pain if every error message used fully-qualified names!
Exporting ST from Data.Array.ST looks like the wrong fix to me. It's fixing a tools problem by changing the library interface - we'd have to do it each time this issue came up. Perhaps the real source of the problem is that the lazy ST monad is called ST? Ok, so that's just blaming the library again, but the fact that two different types have the same name is bound to lead to confusion. Cheers, Simon