I've been looking into the generated C code. The problem seems to be caused by an erroneous optimization that causes the tag for the variant type T3 to be dropped altogether. This would be OK, since the other two constructors are immediate (i.e. aren't boxed) and therefore, at runtime, you can just check if the constructor is a pointer and if it is, then it must be T3C3, and if it's not, check the immediate tag. However, while the representation of the constructors is optimized, the code that checks for tags is not, and expects T3C3 to be tagged.
If you added parameters to any other T3 constructors the optimization wouldn't be triggered and there would be no bug.
I'm a bit hesitant to look further into this, as I'm not involved in the development of JHC (I just happen to have some understanding of the C backend). However, since my current project depends heavily on JHC, if nobody else steps up I might try to fix it myself.
Cheers!