diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,15 @@
 Changelog
 =========
 
+Version 0.3.4.0
+---------------
+
+*August 4, 2020*
+
+<https://github.com/mstksg/nonempty-containers/releases/tag/v0.3.4.0>
+
+*   Add `ToJSON` and `FromJSON` instances.
+
 Version 0.3.3.0
 ---------------
 
diff --git a/nonempty-containers.cabal b/nonempty-containers.cabal
--- a/nonempty-containers.cabal
+++ b/nonempty-containers.cabal
@@ -1,13 +1,13 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.31.2.
+-- This file has been generated from package.yaml by hpack version 0.34.2.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 99b2f1d8a05c4c65da0f4e80d7fe63f0bba58499425adb66fc50f03895929c56
+-- hash: f7b111581e408abad55838cf6ef277f8e5f3fe117ec340c4ff529f0d7141da59
 
 name:           nonempty-containers
-version:        0.3.3.0
+version:        0.3.4.0
 synopsis:       Non-empty variants of containers data types, with full API
 description:    Efficient and optimized non-empty versions of types from /containers/.
                 Inspired by /non-empty-containers/ library, except attempting a more
@@ -50,9 +50,10 @@
       Paths_nonempty_containers
   hs-source-dirs:
       src
-  ghc-options: -Wall -Wcompat -Werror=incomplete-patterns -Wredundant-constraints
+  ghc-options: -Wall -Wcompat -Wredundant-constraints
   build-depends:
-      base >=4.9 && <5
+      aeson
+    , base >=4.9 && <5
     , comonad
     , containers >=0.5.9
     , deepseq
@@ -75,7 +76,7 @@
       Paths_nonempty_containers
   hs-source-dirs:
       test
-  ghc-options: -Wall -Wcompat -Werror=incomplete-patterns -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
+  ghc-options: -Wall -Wcompat -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
   build-depends:
       base >=4.9 && <5
     , comonad
diff --git a/src/Data/IntMap/NonEmpty/Internal.hs b/src/Data/IntMap/NonEmpty/Internal.hs
--- a/src/Data/IntMap/NonEmpty/Internal.hs
+++ b/src/Data/IntMap/NonEmpty/Internal.hs
@@ -58,6 +58,7 @@
 import           Control.Applicative
 import           Control.Comonad
 import           Control.DeepSeq
+import           Control.Monad
 import           Data.Coerce
 import           Data.Data
 import           Data.Function
@@ -69,9 +70,10 @@
 import           Data.Semigroup
 import           Data.Semigroup.Foldable    (Foldable1(fold1))
 import           Data.Semigroup.Traversable (Traversable1(..))
-import           Data.Typeable              (Typeable)
+-- import           Data.Typeable              (Typeable)
 import           Prelude hiding             (foldr1, foldl1, foldr, foldl, map)
 import           Text.Read
+import qualified Data.Aeson                 as A
 import qualified Data.Foldable              as F
 import qualified Data.IntMap                as M
 import qualified Data.List                  as L
@@ -186,6 +188,16 @@
 
 intMapDataType :: DataType
 intMapDataType = mkDataType "Data.IntMap.NonEmpty.Internal.NEIntMap" [fromListConstr]
+
+instance A.ToJSON a => A.ToJSON (NEIntMap a) where
+    toJSON     = A.toJSON . toMap
+    toEncoding = A.toEncoding . toMap
+
+instance A.FromJSON a => A.FromJSON (NEIntMap a) where
+    parseJSON = withNonEmpty (fail err) pure
+            <=< A.parseJSON
+      where
+        err = "NEIntMap: Non-empty map expected, but empty map found"
 
 -- | /O(n)/. Fold the values in the map using the given right-associative
 -- binary operator, such that @'foldr' f z == 'Prelude.foldr' f z . 'elems'@.
diff --git a/src/Data/IntSet/NonEmpty/Internal.hs b/src/Data/IntSet/NonEmpty/Internal.hs
--- a/src/Data/IntSet/NonEmpty/Internal.hs
+++ b/src/Data/IntSet/NonEmpty/Internal.hs
@@ -33,6 +33,7 @@
   ) where
 
 import           Control.DeepSeq
+import           Control.Monad
 import           Data.Data
 import           Data.Function
 import           Data.IntSet.Internal    (IntSet(..), Key)
@@ -40,6 +41,7 @@
 import           Data.Semigroup
 import           Data.Semigroup.Foldable (Foldable1)
 import           Text.Read
+import qualified Data.Aeson              as A
 import qualified Data.Foldable           as F
 import qualified Data.IntSet             as S
 import qualified Data.Semigroup.Foldable as F1
@@ -130,7 +132,15 @@
 intSetDataType = mkDataType "Data.IntSet.NonEmpty.Internal.NEIntSet" [fromListConstr]
 
 
+instance A.ToJSON NEIntSet where
+    toJSON     = A.toJSON . toSet
+    toEncoding = A.toEncoding . toSet
 
+instance A.FromJSON NEIntSet where
+    parseJSON = withNonEmpty (fail err) pure
+            <=< A.parseJSON
+      where
+        err = "NEIntSet: Non-empty set expected, but empty set found"
 
 
 -- | /O(log n)/. Smart constructor for an 'NEIntSet' from a 'IntSet'.  Returns
diff --git a/src/Data/Map/NonEmpty.hs b/src/Data/Map/NonEmpty.hs
--- a/src/Data/Map/NonEmpty.hs
+++ b/src/Data/Map/NonEmpty.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE BangPatterns    #-}
+{-# LANGUAGE EmptyCase       #-}
 {-# LANGUAGE LambdaCase      #-}
 {-# LANGUAGE PatternSynonyms #-}
 {-# LANGUAGE TupleSections   #-}
@@ -2349,7 +2350,7 @@
 --
 -- @since 0.3.1.0
 absurdNEMap :: NEMap Void a -> b
-absurdNEMap (NEMap k _ _) = absurd k
+absurdNEMap = \case {}
 
 -- ---------------------------
 -- Combining functions
diff --git a/src/Data/Map/NonEmpty/Internal.hs b/src/Data/Map/NonEmpty/Internal.hs
--- a/src/Data/Map/NonEmpty/Internal.hs
+++ b/src/Data/Map/NonEmpty/Internal.hs
@@ -53,6 +53,7 @@
 import           Control.Applicative
 import           Control.Comonad
 import           Control.DeepSeq
+import           Control.Monad
 import           Data.Coerce
 import           Data.Data
 import           Data.Function
@@ -66,6 +67,7 @@
 import           Data.Semigroup.Traversable (Traversable1(..))
 import           Prelude hiding             (foldr1, foldl1, foldr, foldl, map)
 import           Text.Read
+import qualified Data.Aeson                 as A
 import qualified Data.Foldable              as F
 import qualified Data.Map                   as M
 import qualified Data.Map.Internal          as M
@@ -187,6 +189,16 @@
 
 mapDataType :: DataType
 mapDataType = mkDataType "Data.Map.NonEmpty.NonEmpty.Internal.NEMap" [fromListConstr]
+
+instance (A.ToJSONKey k, A.ToJSON a) => A.ToJSON (NEMap k a) where
+    toJSON     = A.toJSON . toMap
+    toEncoding = A.toEncoding . toMap
+
+instance (A.FromJSONKey k, Ord k, A.FromJSON a) => A.FromJSON (NEMap k a) where
+    parseJSON = withNonEmpty (fail err) pure
+            <=< A.parseJSON
+      where
+        err = "NEMap: Non-empty map expected, but empty map found"
 
 -- | /O(n)/. Fold the values in the map using the given right-associative
 -- binary operator, such that @'foldr' f z == 'Prelude.foldr' f z . 'elems'@.
diff --git a/src/Data/Sequence/NonEmpty/Internal.hs b/src/Data/Sequence/NonEmpty/Internal.hs
--- a/src/Data/Sequence/NonEmpty/Internal.hs
+++ b/src/Data/Sequence/NonEmpty/Internal.hs
@@ -48,6 +48,7 @@
 
 import           Control.Comonad
 import           Control.DeepSeq
+import           Control.Monad
 import           Control.Monad.Fix
 import           Control.Monad.Zip
 import           Data.Bifunctor
@@ -64,6 +65,7 @@
 import           Data.Sequence              (Seq(..))
 import           Prelude hiding             (length, zipWith, unzip, zip, map, replicate)
 import           Text.Read
+import qualified Data.Aeson                 as A
 import qualified Data.Foldable              as F
 import qualified Data.Sequence              as Seq
 
@@ -187,6 +189,18 @@
 
 seqDataType :: DataType
 seqDataType = mkDataType "Data.Sequence.NonEmpty.Internal.NESeq" [consConstr]
+
+
+instance A.ToJSON a => A.ToJSON (NESeq a) where
+    toJSON     = A.toJSON . toSeq
+    toEncoding = A.toEncoding . toSeq
+
+instance A.FromJSON a => A.FromJSON (NESeq a) where
+    parseJSON = withNonEmpty (fail err) pure
+            <=< A.parseJSON
+      where
+        err = "NESeq: Non-empty sequence expected, but empty sequence found"
+
 
 -- | /O(log n)/. A general continuation-based way to consume a 'Seq' as if
 -- it were an 'NESeq'. @'withNonEmpty' def f@ will take a 'Seq'.  If map is
diff --git a/src/Data/Set/NonEmpty/Internal.hs b/src/Data/Set/NonEmpty/Internal.hs
--- a/src/Data/Set/NonEmpty/Internal.hs
+++ b/src/Data/Set/NonEmpty/Internal.hs
@@ -44,6 +44,7 @@
   ) where
 
 import           Control.DeepSeq
+import           Control.Monad
 import           Data.Data
 import           Data.Function
 import           Data.Functor.Classes
@@ -53,6 +54,7 @@
 import           Data.Set.Internal       (Set(..))
 import           Prelude hiding          (foldr, foldr1, foldl, foldl1)
 import           Text.Read
+import qualified Data.Aeson              as A
 import qualified Data.Foldable           as F
 import qualified Data.Semigroup.Foldable as F1
 import qualified Data.Set                as S
@@ -160,7 +162,15 @@
 setDataType = mkDataType "Data.Set.NonEmpty.Internal.NESet" [fromListConstr]
 
 
+instance A.ToJSON a => A.ToJSON (NESet a) where
+    toJSON     = A.toJSON . toSet
+    toEncoding = A.toEncoding . toSet
 
+instance (A.FromJSON a, Ord a) => A.FromJSON (NESet a) where
+    parseJSON = withNonEmpty (fail err) pure
+            <=< A.parseJSON
+      where
+        err = "NESet: Non-empty set expected, but empty set found"
 
 
 -- | /O(log n)/. Smart constructor for an 'NESet' from a 'Set'.  Returns
