diff --git a/generateDS.py b/generateDS.py
index d0549916e63060f2fa1b03edf11d8bc2250a64cf..74b86916a2d8449bcd3f89e3d11c2f8ec93fc47b 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -257,6 +257,14 @@ Namespacedef = ''
 NoNameSpaceDefs = False
 CleanupNameList = [(re.compile('[-:.]'), '_')]
 PythonIdentifierRegex = re.compile('^[_A-Za-z][_A-Za-z0-9]*$')
+UppercaseEnums = True
+NameSeparationRegexList = [
+    re.compile("(.)([A-Z][a-z]+)"),
+    re.compile("(.)([0-9]+)"),
+    re.compile("([0-9])([a-zA-Z])"),
+    re.compile("([a-z])([A-Z])")
+    ]
+NonAlphaNumRegex = re.compile(r"\W+")
 
 NamespacesDict = {}
 SchemaNamespaceDict = {}
@@ -6675,7 +6683,17 @@ def generateFromTree(wrt, prefix, elements, processed):
 
 
 def generateSimpleTypes(wrt, prefix, simpleTypeDict):
+    global UppercaseEnums
+    def value2Uppercase(value):
+        if UppercaseEnums:
+            # This will turn a string 'fooBar123' to 'foo_Bar_123'
+            for regex in NameSeparationRegexList:
+                value = regex.sub(r"\1_\2", value)
+            value = value.upper()
+            value = NonAlphaNumRegex.sub("", value)
+        return value
     def validateIdentifier(name):
+        name = value2Uppercase(name)
         validPythonIdentifier = True
         if not PythonIdentifierRegex.match(name):
             # it may start with a digit
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index b2d7979434fb2874f24c0cde2c5e06b72cc45812..cd73247b9020dadc20d0afb7aca0d2cce3cd2ed1 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -727,18 +727,18 @@ def _cast(typ, value):
 
 
 class RelationType(object):
-    down='down'
-    add='add'
+    DOWN='down'
+    ADD='add'
 
 
 class RelationType2(object):
-    up='up'
-    subtract='subtract'
+    UP='up'
+    SUBTRACT='subtract'
 
 
 class RelationType3(object):
-    right='right'
-    divide='divide'
+    RIGHT='right'
+    DIVIDE='divide'
 
 
 class SpecialDate(GeneratedsSuper):
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index b8648cec4df9ed7cd385fad833af956fa343a455..da58adfbde587467d82641d27f6cce1a4fd6cc8f 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -727,10 +727,10 @@ def _cast(typ, value):
 
 
 class ArrayTypes(object):
-    float_='float'
-    int='int'
-    Name='Name'
-    token='token'
+    FLOAT='float'
+    INT='int'
+    NAME='Name'
+    TOKEN='token'
 
 
 class people(GeneratedsSuper):
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index 4d56ba5fda0842ea92c2e024abfd6e43185be5fd..74bb82039d230658d01cdcea4ff2dc28c6365b33 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -727,10 +727,10 @@ def _cast(typ, value):
 
 
 class ArrayTypes(object):
-    float_='float'
-    int='int'
-    Name='Name'
-    token='token'
+    FLOAT='float'
+    INT='int'
+    NAME='Name'
+    TOKEN='token'
 
 
 class people(GeneratedsSuper):
diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py
index ab064c5279e30951282fbd416cf02bb0c51c5d64..1cd690f177a765d93ad87bc827a9e9cb3ef6df92 100644
--- a/tests/prefix_classname1_sup.py
+++ b/tests/prefix_classname1_sup.py
@@ -727,10 +727,10 @@ def _cast(typ, value):
 
 
 class ArrayTypes(object):
-    float_='float'
-    int='int'
-    Name='Name'
-    token='token'
+    FLOAT='float'
+    INT='int'
+    NAME='Name'
+    TOKEN='token'
 
 
 class tomato_people(GeneratedsSuper):
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index bdd6a08c9b006991cf8f24e425f3640fa16bc81a..487cd67ecdcbe03316a4b63ea79385fa1faa6e76 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -727,18 +727,18 @@ def _cast(typ, value):
 
 
 class RelationType(object):
-    down='down'
-    add='add'
+    DOWN='down'
+    ADD='add'
 
 
 class RelationType2(object):
-    down='down'
-    add='add'
+    DOWN='down'
+    ADD='add'
 
 
 class RelationType3(object):
-    down='down'
-    add='add'
+    DOWN='down'
+    ADD='add'
 
 
 class SpecialDate(GeneratedsSuper):
diff --git a/tests/test.py b/tests/test.py
index fcbe202cea8e8bd58efd8ed2d7cff94d1526dc33..780132f33df31d692c9b70f7a0a956e83e2c3763 100755
--- a/tests/test.py
+++ b/tests/test.py
@@ -933,7 +933,7 @@ class GenTest(unittest.TestCase):
         diffs = list(diffs)
         if diffs:
             diffs = ''.join(diffs[2:12])
-            self.fail("Files differed:\n{}".format(diffs))
+            self.fail("Files '{}' and '{}' differed:\n{}".format(left, right, diffs))
 
     def remove(self, filename):
         if False:
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index 30ec5a223b63934c12e05e268f2af3ef4735b3d1..fe95d814742fd135c91fd7a544b1a0f3573ec933 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -729,10 +729,10 @@ def _cast(typ, value):
 
 
 class ArrayTypes(object):
-    float_='float'
-    int='int'
-    Name='Name'
-    token='token'
+    FLOAT='float'
+    INT='int'
+    NAME='Name'
+    TOKEN='token'
 
 
 class peopleType(GeneratedsSuper):
diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py
index 2103a485440d163175b7e2c2e8d078dd0dea11d7..3243bb4e03dfa1bef13b22c1b0611d2a3b1d633a 100644
--- a/tests/validate_simpletypes1_sup.py
+++ b/tests/validate_simpletypes1_sup.py
@@ -727,10 +727,10 @@ def _cast(typ, value):
 
 
 class token_enum_st(object):
-    float_='float'
-    int='int'
-    Name='Name'
-    token='token'
+    FLOAT='float'
+    INT='int'
+    NAME='Name'
+    TOKEN='token'
 
 
 class containerType(GeneratedsSuper):
diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py
index a4e7540e979a880afd0aae506f9864361e1b1c5c..b9a98fdf118d2aa5d011093ccee88a13eb923926 100644
--- a/tests/validate_simpletypes2_sup.py
+++ b/tests/validate_simpletypes2_sup.py
@@ -727,10 +727,10 @@ def _cast(typ, value):
 
 
 class token_enum_st(object):
-    float_='float'
-    int='int'
-    Name='Name'
-    token='token'
+    FLOAT='float'
+    INT='int'
+    NAME='Name'
+    TOKEN='token'
 
 
 class containerType(GeneratedsSuper):