diff --git a/aeson-gadt-th.cabal b/aeson-gadt-th.cabal
--- a/aeson-gadt-th.cabal
+++ b/aeson-gadt-th.cabal
@@ -1,9 +1,9 @@
 cabal-version: >=1.10
 name: aeson-gadt-th
-version: 0.1.0.0
+version: 0.1.1.0
 synopsis: Derivation of Aeson instances for GADTs
 category: JSON
-description: Template Haskell for generating ToJSON and FromJSON instances for GADTs
+description: Template Haskell for generating ToJSON and FromJSON instances for GADTs. See <https://github.com/obsidiansystems/aeson-gadt-th/blob/master/README.md README.md> for examples.
 license: BSD3
 license-file: LICENSE
 author: Obsidian Systems LLC
diff --git a/src/Data/Aeson/GADT/TH.hs b/src/Data/Aeson/GADT/TH.hs
--- a/src/Data/Aeson/GADT/TH.hs
+++ b/src/Data/Aeson/GADT/TH.hs
@@ -127,10 +127,19 @@
 conMatchesParseJSON e c = do
   let name = conName c
       match' = match (litP (StringL (nameBase name)))
-  vars <- replicateM (conArity c) (newName "x")
-  let forTypes _ = do
-        let pat = tupP (map varP vars)
-            conApp = foldl appE (conE name) (map varE vars)
+  let forTypes types = do
+        vars <- forM types $ \typ -> do
+          x <- newName "x"
+          case typ of
+            AppT (ConT tn) (VarT vn) -> do
+              -- This may be a nested GADT, so check for special FromJSON instance
+              idec <- reifyInstances ''FromJSON [AppT (ConT ''Some) (ConT tn)]
+              return $ case idec of
+                [] -> (VarP x, VarE x)
+                _ -> (ConP 'This [VarP x], VarE x) -- If a FromJSON instance is found for Some f, then we use it.
+            _ -> return (VarP x, VarE x)
+        let pat = return $ TupP (map fst vars)
+            conApp = return $ foldl AppE (ConE name) (map snd vars)
             body = doE [ bindS pat [| parseJSON $e |]
                        , noBindS [| return (This $conApp) |]
                        ]
