I am using an overloaded version of the StringJoin function since years now, without any problem, as I've invested a lot of time and effort earlier to make its behaviour consistent and predictable (see discussion here). I am fully aware that modifying built-in symbols is not a good idea.
The new StringJoin automatically converts any non-string input to String thus I don't have to type ToString every time. It still threads over lists, i.e. StringJoin[{"1", "2", "3"}] returns "123". Also StringJoin[{1, 2, 3}] returns the same, but StringJoin[{1, 2, 3}, "s"] gives "{1, 2, 3}s". The code is:
toString[expr_String] := expr;
toString[expr_] := ToString@expr;
Unprotect[System`StringJoin];
Attributes[System`StringJoin] = {};
System`StringJoin[expr___] := StringJoin@{expr};
System`StringJoin[expr_List] :=
Fold[StringInsert[#1, toString@#2, -1] &, "", expr];
Protect[System`StringJoin];
For me, it works as expected, and I am really happy to use it as it saves me a lot of typing. Though there is one minor annoyance I cannot track down. Consider the following example:
Append[test, 1];

Note, that the message is printed with List-s wrapping each argument of the printed StringForm (that is: 1 and Append[test, 1]). Interestingly, StringForm on its own works as expected:
StringForm["Test variable insertion: `1`, `2`.", 111, 222]

Question: Can anyone explain why Message fails to print its result correctly?
Caveat:
Modifying System` symbols could have many unexpected side-effects. It happens for this modified StringJoin too (apart from the above example): as Import uses StringJoin, the modification causes a massive performance drop when importing e.g. images. For details, see this post.
Flattenin the 6th line to read:System`StringJoin[expr_List] := Fold[StringInsert[#1, toString@#2, -1] &, "", Flatten@expr];– István Zachar Feb 06 '12 at 14:56StringJoinon lists is wasteful in two ways: it converts to strings even if an expression is a string already, and (which is much worse), by usingFold, it will have quadratic time and memory complexity in the size of the string list (similar toAppendfor lists), while the originalStringJoinis linear. So, someone (this may be you) used to fast action ofStringJoinon lists, will have an unpleasant surprise (perhaps without knowing thatStringJoinwas changed) - another reason to avoid this. – Leonid Shifrin Feb 06 '12 at 16:36Fold, but the code does not convert strings to strings:toStringdoes nothing when its input is already a string. – István Zachar Feb 06 '12 at 17:01StringJoinwhen given lists is documented in the third Basic Example, even if it's not under More Information. – Brett Champion Feb 06 '12 at 18:46StringJoinin heavy computation. Moreover, my question was answered perfectly :) – István Zachar Feb 07 '12 at 08:59