diff --git a/ChangeLog.md b/ChangeLog.md
deleted file mode 100644
--- a/ChangeLog.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Revision history for dependent-sum-aeson-orphans
-
-## 0.1.0.0  -- YYYY-mm-dd
-
-* First version. Released on an unsuspecting world.
diff --git a/dependent-sum-aeson-orphans.cabal b/dependent-sum-aeson-orphans.cabal
--- a/dependent-sum-aeson-orphans.cabal
+++ b/dependent-sum-aeson-orphans.cabal
@@ -1,19 +1,18 @@
 name: dependent-sum-aeson-orphans
-version: 0.1.0.0
+version: 0.2.0.0
 license: BSD3
 license-file: LICENSE
 author: Obsidian Systems
 maintainer: maintainer@obsidian.systems
 copyright: 2018 Obsidian Systems LLC
 build-type: Simple
-extra-source-files: ChangeLog.md
 cabal-version: >=1.10
 description: JSON instances for DSum and DMap
 
 library
   exposed-modules: Data.Dependent.Sum.Orphans
-  build-depends: base >=4.9 && <4.11
-               , aeson >= 1.2 && < 1.3
+  build-depends: base >=4.9 && <4.12
+               , aeson >= 1.2 && <1.5
                , dependent-map
                , dependent-sum
                , constraints
diff --git a/src/Data/Dependent/Sum/Orphans.hs b/src/Data/Dependent/Sum/Orphans.hs
--- a/src/Data/Dependent/Sum/Orphans.hs
+++ b/src/Data/Dependent/Sum/Orphans.hs
@@ -1,6 +1,10 @@
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MonoLocalBinds #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE TypeApplications #-}
+
 module Data.Dependent.Sum.Orphans where
 
 import Data.Aeson
@@ -13,21 +17,19 @@
 import Data.Some (Some)
 import qualified Data.Some as Some
 
-instance (ForallF ToJSON f, Has ToJSON f, ToJSON1 g) => ToJSON (DSum f g) where
-  toJSON ((f :: f a) :=> (x :: g a))
-    | Dict :: Dict (ToJSON a) <- argDict f
-    = toJSON (toJSON f \\ (instF :: ForallF ToJSON f :- ToJSON (f a)), toJSON1 x)
+instance (ForallF ToJSON f, Has' ToJSON f g) => ToJSON (DSum f g) where
+  toJSON ((f :: f a) :=> (g :: g a))
+    = whichever @ToJSON @f @a (has' @ToJSON @g f (toJSON (f, g)))
 
-instance (ForallF ToJSON f, Has ToJSON f, ToJSON1 g) => ToJSON (DMap f g) where
+instance (ForallF ToJSON f, Has' ToJSON f g) => ToJSON (DMap f g) where
     toJSON = toJSON . DMap.toList
 
-instance (FromJSON (Some f), GCompare f, Has FromJSON f, FromJSON1 g) => FromJSON (DSum f g) where
+instance (FromJSON (Some f), Has' FromJSON f g) => FromJSON (DSum f g) where
   parseJSON x = do
-    (tag, val) <- parseJSON x
-    Some.This (parsedTag :: f a) <- parseJSON tag
-    val' <- case argDict parsedTag of
-      (Dict :: Dict (FromJSON a)) -> parseJSON1 val
-    return $ parsedTag :=> val'
+    (jf, jg) <- parseJSON x
+    Some.This (f :: f a) <- parseJSON jf
+    g <- has' @FromJSON @g f (parseJSON jg)
+    return $ f :=> g
 
-instance (FromJSON (Some f), GCompare f, Has FromJSON f, FromJSON1 g) => FromJSON (DMap f g) where
+instance (FromJSON (Some f), GCompare f, Has' FromJSON f g) => FromJSON (DMap f g) where
     parseJSON = fmap DMap.fromList . parseJSON
