Another instance (cut-down) are let-guards like
let Just x | x > 0 = e in x
The "x > 0" is understood as an assertion here, documenting an invariant. However, Haskell reads this as
let Just x = case () of { () | x > 0 -> e } in x
leading to non-termination. A non-recursive version
let' Just x | x > 0 = e in x
could be interpreted as
case e of { Just x | x > 0 -> x }
instead, which is meaningful (in contrast to the current interpretation).