diff --git a/juniper_codegen/src/derive_enum.rs b/juniper_codegen/src/derive_enum.rs
index 40951d9b..934f1de5 100644
--- a/juniper_codegen/src/derive_enum.rs
+++ b/juniper_codegen/src/derive_enum.rs
@@ -124,7 +124,7 @@ pub fn impl_enum(ast: &syn::DeriveInput) -> Tokens {
         // Build value.
         let name = var_attrs
             .name
-            .unwrap_or(variant.ident.as_ref().to_uppercase());
+            .unwrap_or(::util::to_upper_snake_case(variant.ident.as_ref()));
         let descr = match var_attrs.description {
             Some(s) => quote!{ Some(#s.to_string())  },
             None => quote!{ None },
diff --git a/juniper_codegen/src/util.rs b/juniper_codegen/src/util.rs
index a3096c7b..9ae094c2 100644
--- a/juniper_codegen/src/util.rs
+++ b/juniper_codegen/src/util.rs
@@ -80,3 +80,38 @@ fn test_to_camel_case() {
     assert_eq!(&to_camel_case("a")[..], "a");
     assert_eq!(&to_camel_case("")[..], "");
 }
+
+pub(crate) fn to_upper_snake_case(s: &str) -> String {
+    let mut last_lower = false;
+    let mut upper = String::new();
+    for c in s.chars() {
+        if c == '_' {
+            last_lower = false;
+        }
+        else if c.is_lowercase() {
+            last_lower = true;
+        } else if c.is_uppercase() {
+            if last_lower {
+                upper.push('_');
+            }
+            last_lower = false;
+        }
+
+        for u in c.to_uppercase() {
+            upper.push(u);
+        }
+    }
+    upper
+}
+
+#[test]
+fn test_to_upper_snake_case() {
+    assert_eq!(to_upper_snake_case("abc"), "ABC");
+    assert_eq!(to_upper_snake_case("a_bc"), "A_BC");
+    assert_eq!(to_upper_snake_case("ABC"), "ABC");
+    assert_eq!(to_upper_snake_case("A_BC"), "A_BC");
+    assert_eq!(to_upper_snake_case("SomeInput"), "SOME_INPUT");
+    assert_eq!(to_upper_snake_case("someInput"), "SOME_INPUT");
+    assert_eq!(to_upper_snake_case("someINpuT"), "SOME_INPU_T");
+    assert_eq!(to_upper_snake_case("some_INpuT"), "SOME_INPU_T");
+}