This was changed in .NET 4.5. Beware that it is difficult to see whether you have 4.0 or 4.5 installed on the machine, 4.5 replaces 4.0 and uses the same install directory as 4.0.
The method that was changed is the one that @Dirk quoted, the internal IsIntegerType() helper method. The 4.0 version looks like this:
internal static bool IsIntegerType(Type t)
{
if (((!(t == typeof(int)) && !(t == typeof(short))) && (!(t == typeof(ushort)) &&
!(t == typeof(byte)))) && ((!(t == typeof(sbyte)) && !(t == typeof(uint))) &&
!(t == typeof(long))))
{
return (t == typeof(ulong));
}
return true;
}
Note how typeof(char) isn't being tested so it doesn't consider it a valid type for the value argument you pass to Enum.GetName().
These kind of changes in a .NET Framework version that is not a side-by-side version are fairly uncool, it does make it awfully hard to diagnose program failure. Especially since you targeted NET 4.0 in your project but ended up running on a machine that had 4.5 installed so never noticed the problem. But kaboom on a machine on which only 4.0 is installed.
The best possible spin to put on it that this was a bug in 4.0 that they fixed in 4.5. And frankly it was, you of course expected a char to be completely valid since that's what you used to initialize the enum members. It does show how difficult it is for Microsoft to ever fix bugs.