diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Revision history for deriving-aeson
 
+## 0.2
+
+* Added `Sum*` for changing the encoding of variants
+* Added `Vanilla = CustomJSON '[]`
+* Renamed `ContructorTagModifier` to `ConstructorTagModifier`
+* Added `toEncoding` implementation to `CustomJSON`
+
 ## 0.1.2
 
 * Reexported `CustomJSON(..)` from `Deriving.Aeson.Stock`
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 [![Discord](https://img.shields.io/discord/664807830116892674?color=%237095ec&label=Discord&style=plastic)](https://discord.gg/DG93Tgs)
 
 This package provides a newtype wrapper where you can customise
-[aeson](https://hackage,haskell.org/package/aeson)'s generic methods using a
+[aeson](https://hackage.haskell.org/package/aeson)'s generic methods using a
 type-level interface, which synergises well with DerivingVia.
 
 ```haskell
diff --git a/deriving-aeson.cabal b/deriving-aeson.cabal
--- a/deriving-aeson.cabal
+++ b/deriving-aeson.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                deriving-aeson
-version:             0.1.2
+version:             0.2
 synopsis:            Type driven generic aeson instance customisation
 description:         This package provides a newtype wrapper with
   FromJSON/ToJSON instances customisable via a phantom type parameter.
@@ -14,11 +14,15 @@
 category:            JSON, Generics
 extra-source-files:  CHANGELOG.md, README.md
 
+source-repository head
+  type: git
+  location: https://github.com/fumieval/deriving-aeson.git
+
 library
   exposed-modules:
     Deriving.Aeson
     Deriving.Aeson.Stock
-  build-depends:       base >= 4.12 && <5, aeson
+  build-depends:       base >= 4.12 && <5, aeson >= 1.3 && <1.5
   hs-source-dirs: src
   default-language:    Haskell2010
   ghc-options: -Wall
diff --git a/src/Deriving/Aeson.hs b/src/Deriving/Aeson.hs
--- a/src/Deriving/Aeson.hs
+++ b/src/Deriving/Aeson.hs
@@ -13,10 +13,15 @@
 module Deriving.Aeson
   ( CustomJSON(..)
   , FieldLabelModifier
-  , ConstrctorTagModifier
+  , ConstructorTagModifier
   , OmitNothingFields
   , TagSingleConstructors
   , NoAllNullaryToStringTag
+  -- * Sum encoding
+  , SumTaggedObject
+  , SumUntaggedValue
+  , SumObjectWithSingleField
+  , SumTwoElemArray
   -- * Name modifiers
   , StripPrefix
   , CamelToKebab
@@ -45,15 +50,17 @@
   parseJSON = (coerce `asTypeOf` fmap CustomJSON) . genericParseJSON (aesonOptions @t)
   {-# INLINE parseJSON #-}
 
-instance (AesonOptions t, Generic a, GToJSON Zero (Rep a)) => ToJSON (CustomJSON t a) where
+instance (AesonOptions t, Generic a, GToJSON Zero (Rep a), GToEncoding Zero (Rep a)) => ToJSON (CustomJSON t a) where
   toJSON = genericToJSON (aesonOptions @t) . unCustomJSON
   {-# INLINE toJSON #-}
+  toEncoding = genericToEncoding (aesonOptions @t) . unCustomJSON
+  {-# INLINE toEncoding #-}
 
 -- | Function applied to field labels. Handy for removing common record prefixes for example.
 data FieldLabelModifier t
 
 -- | Function applied to constructor tags which could be handy for lower-casing them for example.
-data ConstrctorTagModifier t
+data ConstructorTagModifier t
 
 -- | Record fields with a Nothing value will be omitted from the resulting object.
 data OmitNothingFields
@@ -90,6 +97,11 @@
 instance StringModifier CamelToSnake where
   getStringModifier = camelTo2 '_'
 
+data SumTaggedObject t c
+data SumUntaggedValue
+data SumObjectWithSingleField
+data SumTwoElemArray
+
 -- | Reify 'Options' from a type-level list
 class AesonOptions xs where
   aesonOptions :: Options
@@ -103,7 +115,7 @@
 instance (StringModifier f, AesonOptions xs) => AesonOptions (FieldLabelModifier f ': xs) where
   aesonOptions = (aesonOptions @xs) { fieldLabelModifier = getStringModifier @f }
 
-instance (StringModifier f, AesonOptions xs) => AesonOptions (ConstrctorTagModifier f ': xs) where
+instance (StringModifier f, AesonOptions xs) => AesonOptions (ConstructorTagModifier f ': xs) where
   aesonOptions = (aesonOptions @xs) { constructorTagModifier = getStringModifier @f }
 
 instance AesonOptions xs => AesonOptions (TagSingleConstructors ': xs) where
@@ -111,3 +123,15 @@
 
 instance AesonOptions xs => AesonOptions (NoAllNullaryToStringTag ': xs) where
   aesonOptions = (aesonOptions @xs) { allNullaryToStringTag = False }
+
+instance (KnownSymbol t, KnownSymbol c, AesonOptions xs) => AesonOptions (SumTaggedObject t c ': xs) where
+  aesonOptions = (aesonOptions @xs) { sumEncoding = TaggedObject (symbolVal (Proxy @ t)) (symbolVal (Proxy @ t)) }
+
+instance (KnownSymbol t, KnownSymbol c, AesonOptions xs) => AesonOptions (SumUntaggedValue ': xs) where
+  aesonOptions = (aesonOptions @xs) { sumEncoding = UntaggedValue }
+
+instance (KnownSymbol t, KnownSymbol c, AesonOptions xs) => AesonOptions (SumObjectWithSingleField ': xs) where
+  aesonOptions = (aesonOptions @xs) { sumEncoding = ObjectWithSingleField }
+
+instance (KnownSymbol t, KnownSymbol c, AesonOptions xs) => AesonOptions (SumTwoElemArray ': xs) where
+  aesonOptions = (aesonOptions @xs) { sumEncoding = ObjectWithSingleField }
diff --git a/src/Deriving/Aeson/Stock.hs b/src/Deriving/Aeson/Stock.hs
--- a/src/Deriving/Aeson/Stock.hs
+++ b/src/Deriving/Aeson/Stock.hs
@@ -5,6 +5,7 @@
   ( Prefixed
   , PrefixedSnake
   , Snake
+  , Vanilla
   -- * Reexports
   , CustomJSON(..)
   , FromJSON
@@ -21,3 +22,6 @@
 
 -- | Convert from CamelCase to snake_case
 type Snake = CustomJSON '[FieldLabelModifier CamelToSnake]
+
+-- | No customisation
+type Vanilla = CustomJSON '[]
