diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -14,6 +14,10 @@
 
 # Changelog
 
+* 3.1.0.0
+  - Removed `Read` instance for `Which []` since it is uninhabitable.
+  - `xxxTag` functions only rely on `UniqueMember`, not `UniqueLabelMember`
+
 * 3.0.0.0
   - Renamed `fetch` to `grab` to avoid conflicting with Haxl.
   - Removed unused type functions from removed splitting functions (Before,To,After,From,Length)
diff --git a/data-diverse.cabal b/data-diverse.cabal
--- a/data-diverse.cabal
+++ b/data-diverse.cabal
@@ -1,5 +1,5 @@
 name:                data-diverse
-version:             3.0.0.0
+version:             3.1.0.0
 synopsis:            Extensible records and polymorphic variants.
 description:         "Data.Diverse.Many" is an extensible record for any size encoded efficiently as (Seq Any).
                      "Data.Diverse.Which" is a polymorphic variant of possibilities encoded as (Int, Any).
@@ -69,7 +69,6 @@
   build-depends:       base
                      , data-diverse
                      , criterion
-  ghc-options:         -O2
   default-language:    Haskell2010
 
 source-repository head
diff --git a/src/Data/Diverse/Many/Internal.hs b/src/Data/Diverse/Many/Internal.hs
--- a/src/Data/Diverse/Many/Internal.hs
+++ b/src/Data/Diverse/Many/Internal.hs
@@ -437,10 +437,10 @@
 
 --------------------------------------------------
 
--- | Variation of 'grabL' specialized for 'Tagged' that untags the field.
-grabTag :: forall l x xs. (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs)
+-- | Variation of 'grab' of a Tagged field 'Tagged' that untags the field.
+grabTag :: forall l x xs. (UniqueMember (Tagged l x) xs)
     => Many xs -> x
-grabTag xs = unTagged (grabL @l xs)
+grabTag xs = unTagged (grab @(Tagged l x) xs)
 
 --------------------------------------------------
 
@@ -507,15 +507,15 @@
 
 --------------------------------------------------
 
--- | Variation of 'replaceL'' specialized to 'Tagged' that automatically tags the value to be replaced.
-replaceTag' :: forall l xs x. (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs)
+-- | Variation of 'replace'' specialized to 'Tagged' that automatically tags the value to be replaced.
+replaceTag' :: forall l xs x. (UniqueMember (Tagged l x) xs)
   => Many xs -> x -> Many xs
-replaceTag' xs x = replaceL' @l xs (Tagged @l x)
+replaceTag' xs x = replace' @(Tagged l x) xs (Tagged @l x)
 
--- | Variation of 'replaceL' specialized to 'Tagged' that automatically tags the value to be replaced.
-replaceTag :: forall l x y xs. (UniqueLabelMember l xs, x ~ KindAtLabel l xs)
-  => Many xs -> y -> Many (Replace x (Tagged l y) xs)
-replaceTag xs y = replaceL @l xs (Tagged @l y)
+-- | Variation of 'replace' specialized to 'Tagged' that automatically tags the value to be replaced.
+replaceTag :: forall l x y xs. (UniqueMember (Tagged l x) xs)
+  => Many xs -> y -> Many (Replace (Tagged l x) (Tagged l y) xs)
+replaceTag xs y = replace @(Tagged l x) xs (Tagged @l y)
 
 --------------------------------------------------
 
diff --git a/src/Data/Diverse/Which/Internal.hs b/src/Data/Diverse/Which/Internal.hs
--- a/src/Data/Diverse/Which/Internal.hs
+++ b/src/Data/Diverse/Which/Internal.hs
@@ -216,10 +216,10 @@
   => x -> Which xs
 pickL = pick_ @x
 
--- | Variation of 'pickL' specialized to 'Tagged' that automatically tags the value.
-pickTag :: forall l x xs . (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs)
+-- | Variation of 'pick' specialized to 'Tagged' that automatically tags the value.
+pickTag :: forall l x xs . (UniqueMember (Tagged l x) xs)
   => x -> Which xs
-pickTag a = pickL @l (Tagged @l a)
+pickTag a = pick @(Tagged l x) (Tagged @l a)
 
 -- | A variation of 'pick' into a 'Which' of a single type.
 --
@@ -322,9 +322,9 @@
 -- | Variation of 'trialL' specialized to 'Tagged' which untags the field.
 trialTag
     :: forall l x xs.
-       (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs)
+       (UniqueMember (Tagged l x) xs)
     => Which xs -> Either (Which (Remove (Tagged l x) xs)) x
-trialTag xs = unTagged <$> trialL @l xs
+trialTag xs = unTagged <$> trial @(Tagged l x) xs
 
 -- | Variation of 'trialN' which returns a Maybe
 trialN'
@@ -353,9 +353,9 @@
 -- | Variation of 'trialL'' specialized to 'Tagged' which untags the field.
 trialTag'
     :: forall l x xs.
-       (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs)
+       (UniqueMember (Tagged l x) xs)
     => Which xs -> Maybe x
-trialTag' xs = unTagged <$> trialL' @l xs
+trialTag' xs = unTagged <$> trial' @(Tagged l x) xs
 
 -- | A variation of a 'Which' 'trial' which 'trial's the first type in the type list.
 --
@@ -872,11 +872,6 @@
             pure $ Which n v
       where
         app_prec = 10
-
--- | Reading a 'Which '[]' value is always a parse error, considering
--- 'Which '[]' as a data type with no constructors.
-instance Read (Which '[]) where
-    readsPrec _ _ = []
 
 ------------------------------------------------------------------
 instance NFData (Which '[]) where
diff --git a/test/Data/Diverse/WhichSpec.hs b/test/Data/Diverse/WhichSpec.hs
--- a/test/Data/Diverse/WhichSpec.hs
+++ b/test/Data/Diverse/WhichSpec.hs
@@ -259,7 +259,6 @@
                     reinterpret' @'[] z `shouldBe` Just z
                     reinterpret @'[] z `shouldBe` Right z
                     diversify @'[] z `shouldBe` z
-                    read (show z) `shouldBe` z
                     compare z z `shouldBe` EQ
             reinterpret' @'[] x `shouldBe` Nothing
             reinterpret @'[] x `shouldBe` Left x
