diff --git a/RJson.cabal b/RJson.cabal
--- a/RJson.cabal
+++ b/RJson.cabal
@@ -1,5 +1,5 @@
 Name:          RJson
-Version:       0.3.1
+Version:       0.3.2
 Cabal-Version: >= 1.2
 License:       BSD3
 License-File:  LICENSE
diff --git a/Text/RJson.hs b/Text/RJson.hs
--- a/Text/RJson.hs
+++ b/Text/RJson.hs
@@ -31,6 +31,8 @@
                    enumFromJson,
                    stripInitialUnderscores,
                    toJsonString,
+                   firstCharToUpper,
+                   firstCharToLower,
                    Union(..), Union3, Union4, Union5, Union6,
                    Union7,Union8,Union9,Union10)
 where
@@ -288,10 +290,11 @@
             error ("Unable to serialize the primitive type '" ++ typename x ++ "'")
 
 -- | This function can be used as an implementation of 'toJson' for simple enums.
---   It just converts an enum value to a string determined by the name of the constructor.
-enumToJson :: (Data ToJsonD a, ToJson a, TranslateField a) => a -> JsonData
-enumToJson x
-    | isAlgType (dataTypeOf toJsonProxy x) = JDString (show (toConstr toJsonProxy x))
+--   It just converts an enum value to a string determined by the name of the constructor,
+--   after being fed through the (String -> String) function given as the first argument.
+enumToJson :: (Data ToJsonD a, ToJson a, TranslateField a) => (String -> String) -> a -> JsonData
+enumToJson transform x
+    | isAlgType (dataTypeOf toJsonProxy x) = JDString (transform (showConstr (toConstr toJsonProxy x)))
     | True = error "Passed non-algebraic type to enumToJson"
 
 instance (Data ToJsonD t, TranslateField t) => ToJson t where
@@ -522,13 +525,20 @@
       _            -> Left "Bad fromJson conversion: Non-algebraic datatype given to 'genericFromJson'"
 genericFromJson _ _ = Left "Bad fromJson conversion: Expecting JSON object or array"
 
+constrNames :: (Data FromJsonD a, Data TranslateFieldD a) => a -> [String]
+constrNames x = map showConstr (dataTypeConstrs (dataTypeOf fromJsonProxy x))
+
 -- | The counterpart of 'enumToJson'.
-enumFromJson :: (Data FromJsonD a, Data TranslateFieldD a) => a -> JsonData -> Either String a
-enumFromJson dummy (JDString s) =
-    case fromConstrM fromJsonProxy Nothing (mkConstr (dataTypeOf fromJsonProxy dummy) s [] Prefix ) of
-      Nothing -> Left "Error in enumFromJson"
-      Just x -> Right x
-enumFromJson _ _ = Left "Non-string given to enumFromJson"
+enumFromJson :: (Data FromJsonD a, Data TranslateFieldD a) => (String -> String) -> a -> JsonData -> Either String a
+enumFromJson transform dummy (JDString s) =
+    let cname = (transform s) in
+    if elem cname (constrNames dummy)
+       then
+           case fromConstrM fromJsonProxy Nothing (mkConstr (dataTypeOf fromJsonProxy dummy) cname [] Prefix ) of
+             Nothing -> Left "Error in enumFromJson"
+             Just x -> Right x
+       else Left "Constructor name not recognized in enumFromJson"
+enumFromJson _ _ _ = Left "Non-string given to enumFromJson"
           
 instance (Data FromJsonD t, Data TranslateFieldD t) => FromJson t where
     fromJson = genericFromJson
@@ -729,9 +739,27 @@
 toJsonString :: ToJson a => a -> String
 toJsonString = show . toJson
 
+
+--
+-- A couple of utility functions.
+--
+firstCharToUpper :: String -> String
+firstCharToUpper "" = ""
+firstCharToUpper (c:cs) = (toUpper c) : cs
+
+firstCharToLower :: String -> String
+firstCharToLower "" = ""
+firstCharToLower (c:cs) = (toLower c) : cs
+
 {-
 data Test = Foo | Bar deriving Show
 $(derive[''Test])
+
+instance ToJson Test where
+    toJson = enumToJson firstCharToLower
+instance FromJson Test where
+    fromJson = enumFromJson firstCharToUpper
+
 data Test2 = Test2 Int Int deriving Show
 $(derive[''Test2])
 data Test4 = Test4 { z :: String } deriving Show
