And I bet those green threads still need an IO type of some sort to encode anything non-pure, plus usually do-syntax. Comparing merely concurrent computations to I/O-async is just weird. In fact, I suspect that even those green threads already have a "colourful" type, although I can't check right now.
In a sense, kinda? The function colour problem is that you can't call an async API from a non-async caller without modifying the entire call chain (or blocking the full thread). In async/await languages the conflict comes from changing the return types; the syntax is orthogonal.
Maybe in practice some properties of code are better off being whole-program than represented as types, even if they're less modular or harder to check.
Also thanks for the reference, I haven't touched Haskell in ages; I'm more of an F# and OCaml guy.