If we expose it on the Haskell level, I find MkSum_1_2# the right thing
to do: It makes it clear that (conceptually) there really is a
constructor of that name, and it is distinct from MkSum_2_2#, and the
user cannot do computation with these indices.

I don't mind MkSum_1_2#, it avoids the awkwardness of attaching it to a closing delimiter.  But...  it does still introduce the idea of cutting up tokens to get numbers out of them, which is kind of hacky.  (There seems to be a conserved particle of hackiness here that can't be eliminate, but it doesn't bother me too much.)