diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -14,13 +14,16 @@
 
 # Changelog
 
+* 4.4.0.0
+  - Renamed `Unconstrained` to `C0`. Added `C2`, `C3`, `C4`, `C5`, `C6`.
+
 * 4.3.0.0
-  - Renamed `Unconstrained` to `Unconstrained`
+  - Renamed `NoConstraint` to `Unconstrained`
 
 * 4.2.0.0
   - Added `CaseFunc1` to allow `afmap` of with `Functor`, etc.
   - `Which` is now also an instance of `AFoldable`.
-  - Added `Unconstrained` which is useful for `CaseFunc1` for unused constraints.
+  - Added `NoConstraint` which is useful for `CaseFunc1` for unused constraints.
   - Added `definitely`.
 
 * 4.1.0.0
@@ -41,7 +44,7 @@
   - Removed `CanAppendUnique` (not useful).
 
 * 2.0.1.0
-  - Simplified type synonyms for Which. Added Reinterpreted constraint synonym.
+  - Simplified type synonyms for `Which`. Added `Reinterpreted` constraint synonym.
 
 * 2.0.0.0
   - Breaking change: the prime (xxx') version of functions are now consistently the simpler or non-polymorphic version.
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:             4.3.0.0
+version:             4.4.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).
diff --git a/src/Data/Diverse/TypeLevel.hs b/src/Data/Diverse/TypeLevel.hs
--- a/src/Data/Diverse/TypeLevel.hs
+++ b/src/Data/Diverse/TypeLevel.hs
@@ -3,10 +3,12 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TypeInType #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
 
 module Data.Diverse.TypeLevel where
 
@@ -176,5 +178,21 @@
 -- https://hackage.haskell.org/package/vinyl-0.6.0/docs/Data-Vinyl-TypeLevel.html#t:AllConstrained
 
 -- | This is useful as a level function for @k@ in 'CaseFunc1'
-instance Unconstrained a where
-class Unconstrained a where
+class C0 a where
+instance C0 a where
+
+-- UndecidableSuperInstances :(
+class (c1 a, c2 a) => C2 c1 c2 a where
+instance (c1 a, c2 a) => C2 c1 c2 a where
+
+class (c1 a, c2 a, c3 a) => C3 c1 c2 c3 a where
+instance (c1 a, c2 a, c3 a) => C3 c1 c2 c3 a where
+
+class (c1 a, c2 a, c3 a, c4 a) => C4 c1 c2 c3 c4 a where
+instance (c1 a, c2 a, c3 a, c4 a) => C4 c1 c2 c3 c4 a where
+
+class (c1 a, c2 a, c3 a, c4 a, c5 a) => C5 c1 c2 c3 c4 c5 a where
+instance (c1 a, c2 a, c3 a, c4 a, c5 a) => C5 c1 c2 c3 c4 c5 a where
+
+class (c1 a, c2 a, c3 a, c4 a, c5 a, c6 a) => C6 c1 c2 c3 c4 c5 c6 a where
+instance (c1 a, c2 a, c3 a, c4 a, c5 a, c6 a) => C6 c1 c2 c3 c4 c5 c6 a where
diff --git a/test/Data/Diverse/ManySpec.hs b/test/Data/Diverse/ManySpec.hs
--- a/test/Data/Diverse/ManySpec.hs
+++ b/test/Data/Diverse/ManySpec.hs
@@ -336,5 +336,5 @@
                 mz = (Just "5" :: Maybe String) ./ (["6"] :: [String]) ./ nil
             afmap (CaseFunc' @Num (+10)) x `shouldBe` y
             afmap (CaseFunc @Show @String show) x `shouldBe` z
-            afmap (CaseFunc1' @Unconstrained @Functor @Num (fmap (+10))) mx `shouldBe` my
-            afmap (CaseFunc1 @Unconstrained @Functor @Show @String (fmap show)) mx `shouldBe` mz
+            afmap (CaseFunc1' @C0 @Functor @Num (fmap (+10))) mx `shouldBe` my
+            afmap (CaseFunc1 @C0 @Functor @(C2 Show Read) @String (fmap show)) mx `shouldBe` mz
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
@@ -282,5 +282,5 @@
                 mz = pickN @1 (Just "5" :: Maybe String) :: Which '[Maybe String, Maybe String, Maybe String]
             afmap (CaseFunc' @Num (+10)) x `shouldBe` y
             afmap (CaseFunc @Show @String show) x `shouldBe` z
-            afmap (CaseFunc1' @Unconstrained @Functor @Num (fmap (+10))) mx `shouldBe` my
-            afmap (CaseFunc1 @Unconstrained @Functor @Show @String (fmap show)) mx `shouldBe` mz
+            afmap (CaseFunc1' @C0 @Functor @Num (fmap (+10))) mx `shouldBe` my
+            afmap (CaseFunc1 @C0 @Functor @Show @String (fmap show)) mx `shouldBe` mz
