diff --git a/indextype.cabal b/indextype.cabal
--- a/indextype.cabal
+++ b/indextype.cabal
@@ -1,5 +1,5 @@
 name:                 indextype
-version:              0.2.0.0
+version:              0.2.1.0
 synopsis: A series of type families and constraints for "indexable" types.
 description:
   This package deals with types that can roughly be "indexed" at compile time by an integer.
@@ -11,7 +11,7 @@
 author:               Clinton Mead
 maintainer:           clintonmead@gmail.com
 category:             Control
-license: MIT
+license: BSD3
 license-file: LICENSE
 copyright: Clinton Mead (2017)
 build-type:           Simple
@@ -24,7 +24,14 @@
   location: https://github.com/clintonmead/indextype.git
 
 library
-  exposed-modules:      Control.IndexT, Control.IndexT.Tuple, Control.IndexT.Function, Control.IndexT.Constructor
+  exposed-modules:
+    Control.IndexT,
+    Control.IndexT.Tuple,
+    Control.IndexT.Function,
+    Control.IndexT.Constructor,
+    Control.IndexT.TypeLevel,
+    Control.IndexT.TypeLevel.Tuple
+
   build-depends:        base == 4.9.*
   hs-source-dirs:       src
   default-language:     Haskell2010
diff --git a/src/Control/IndexT/Constructor.hs b/src/Control/IndexT/Constructor.hs
--- a/src/Control/IndexT/Constructor.hs
+++ b/src/Control/IndexT/Constructor.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE KindSignatures #-}
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE PolyKinds #-}
 
 {-|
 This module provides a way to constrain types to be data constructors, much like
@@ -32,7 +33,7 @@
 
 the ith (zero based) parameter of the constructor with n parameters, i.e. @a_i@
 -}
-type family IndexC (n :: Nat) (i :: Nat) a
+type family IndexC (n :: Nat) (i :: Nat) (a :: k1) = (r :: k2)
 
 type instance IndexC 1 0 (_ a) = a
 type instance IndexC 2 0 (_ a _) = a
diff --git a/src/Control/IndexT/TypeLevel.hs b/src/Control/IndexT/TypeLevel.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/IndexT/TypeLevel.hs
@@ -0,0 +1,149 @@
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE PolyKinds #-}
+
+{-|
+Module      : Control.IndexT
+Copyright   : Clinton Mead, 2017
+License     : BSD3
+Maintainer  : clintonmead@gmail.com
+Stability   : experimental
+Portability : GHC
+
+This module just has the 'Control.IndexT.IndexT' type extraction function but raised to type level
+-}
+
+module Control.IndexT.TypeLevel (
+  IndexT
+  ) where
+
+import GHC.TypeLits (Nat)
+import Data.Functor.Identity (Identity(Identity))
+
+{-|
+'Control.IndexT.IndexT' on polykinded type level tuples.
+
+Note this currently is only defined on tuples.
+-}
+type family IndexT (i :: Nat) (a :: k) = (r :: k')
+type instance IndexT 0 ('Identity a) = a
+type instance IndexT 0 '(a, _) = a
+type instance IndexT 1 '(_, a) = a
+type instance IndexT 0 '(a, _, _) = a
+type instance IndexT 1 '(_, a, _) = a
+type instance IndexT 2 '(_, _, a) = a
+type instance IndexT 0 '(a, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _) = a
+type instance IndexT 2 '(_, _, a, _) = a
+type instance IndexT 3 '(_, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _) = a
+type instance IndexT 4 '(_, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a, _) = a
+type instance IndexT 7 '(_, _, _, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _) = a
+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _) = a
+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _) = a
+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _) = a
+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _) = a
+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _) = a
+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _) = a
+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _) = a
+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _) = a
+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _, _) = a
+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _, _) = a
+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _, _) = a
+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _, _) = a
+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a, _) = a
+type instance IndexT 11 '(_, _, _, _, _, _, _, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _, _, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _, _, _) = a
+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _, _, _) = a
+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _, _, _) = a
+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _, _, _) = a
+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a, _, _) = a
+type instance IndexT 11 '(_, _, _, _, _, _, _, _, _, _, _, a, _) = a
+type instance IndexT 12 '(_, _, _, _, _, _, _, _, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _, _, _, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _, _, _, _) = a
+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _, _, _, _) = a
+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _, _, _, _) = a
+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _, _, _, _) = a
+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a, _, _, _) = a
+type instance IndexT 11 '(_, _, _, _, _, _, _, _, _, _, _, a, _, _) = a
+type instance IndexT 12 '(_, _, _, _, _, _, _, _, _, _, _, _, a, _) = a
+type instance IndexT 13 '(_, _, _, _, _, _, _, _, _, _, _, _, _, a) = a
+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _, _, _, _, _) = a
+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _, _, _, _, _) = a
+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _, _, _, _, _) = a
+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _, _, _, _, _) = a
+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _, _, _, _, _) = a
+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a, _, _, _, _) = a
+type instance IndexT 11 '(_, _, _, _, _, _, _, _, _, _, _, a, _, _, _) = a
+type instance IndexT 12 '(_, _, _, _, _, _, _, _, _, _, _, _, a, _, _) = a
+type instance IndexT 13 '(_, _, _, _, _, _, _, _, _, _, _, _, _, a, _) = a
+type instance IndexT 14 '(_, _, _, _, _, _, _, _, _, _, _, _, _, _, a) = a
diff --git a/src/Control/IndexT/TypeLevel/Tuple.hs b/src/Control/IndexT/TypeLevel/Tuple.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/IndexT/TypeLevel/Tuple.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE TypeOperators #-}
+{-|
+Type family and class definitions for dealing with tuples.
+
+"Control.IndexT.Tuple" but with tuples raised to the type level and polykinded.
+-}
+
+module Control.IndexT.TypeLevel.Tuple (
+  TupleConstraint,
+  HomoTupleConstraint,
+  IsTuple,
+  IsHomoTuple
+  )
+where
+
+import Control.IndexT.TypeLevel (IndexT)
+
+import GHC.TypeLits (Nat)
+import GHC.Exts (Constraint)
+import Data.Functor.Identity (Identity(Identity))
+import Data.Type.Equality (type (~~))
+{-|
+Type level version of 'Control.IndexT.TupleConstraint'
+-}
+type family TupleConstraint (n :: Nat) (a :: k) :: Constraint
+type instance TupleConstraint 0 a = a ~~ '()
+type instance TupleConstraint 2 a = a ~~ '(IndexT 0 a, IndexT 1 a)
+type instance TupleConstraint 3 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a)
+type instance TupleConstraint 4 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a)
+type instance TupleConstraint 5 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a)
+type instance TupleConstraint 6 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a)
+type instance TupleConstraint 7 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a)
+type instance TupleConstraint 8 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a)
+type instance TupleConstraint 9 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a)
+type instance TupleConstraint 10 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a)
+type instance TupleConstraint 11 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a)
+type instance TupleConstraint 12 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a, IndexT 11 a)
+type instance TupleConstraint 13 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a, IndexT 11 a, IndexT 12 a)
+type instance TupleConstraint 14 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a, IndexT 11 a, IndexT 12 a, IndexT 13 a)
+type instance TupleConstraint 15 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a, IndexT 11 a, IndexT 12 a, IndexT 13 a, IndexT 14 a)
+
+
+
+{-|
+'HomoTupleConstraint' simply further constrains 'TupleConstraint' so that all the elements are the same.
+
+So @HomoTupleConstraint 3 t@ basically says @t ~ (u,u,u)@ for some @u@,
+
+(\"Homo\" is short for \"Homogeneous\". As in, all the same. Or like milk.)
+-}
+type family HomoTupleConstraint (n :: Nat) a :: Constraint
+type instance HomoTupleConstraint 0 a = (TupleConstraint 0 a)
+type instance HomoTupleConstraint 1 a = (TupleConstraint 1 a)
+type instance HomoTupleConstraint 2 a = (TupleConstraint 2 a, IndexT 0 a ~ IndexT 1 a)
+type instance HomoTupleConstraint 3 a = (TupleConstraint 3 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a)
+type instance HomoTupleConstraint 4 a = (TupleConstraint 4 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a)
+type instance HomoTupleConstraint 5 a = (TupleConstraint 5 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a)
+type instance HomoTupleConstraint 6 a = (TupleConstraint 6 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a)
+type instance HomoTupleConstraint 7 a = (TupleConstraint 7 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a)
+type instance HomoTupleConstraint 8 a = (TupleConstraint 8 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a)
+type instance HomoTupleConstraint 9 a = (TupleConstraint 9 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a)
+type instance HomoTupleConstraint 10 a = (TupleConstraint 10 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a)
+type instance HomoTupleConstraint 11 a = (TupleConstraint 11 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a)
+type instance HomoTupleConstraint 12 a = (TupleConstraint 12 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a, IndexT 10 a ~ IndexT 11 a)
+type instance HomoTupleConstraint 13 a = (TupleConstraint 13 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a, IndexT 10 a ~ IndexT 11 a, IndexT 11 a ~ IndexT 12 a)
+type instance HomoTupleConstraint 14 a = (TupleConstraint 14 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a, IndexT 10 a ~ IndexT 11 a, IndexT 11 a ~ IndexT 12 a, IndexT 12 a ~ IndexT 13 a)
+type instance HomoTupleConstraint 15 a = (TupleConstraint 15 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a, IndexT 10 a ~ IndexT 11 a, IndexT 11 a ~ IndexT 12 a, IndexT 12 a ~ IndexT 13 a, IndexT 13 a ~ IndexT 14 a)
+
+{-|
+GHC does not allow you to partially apply type families (or any type declaration for that matter).
+So if you have a type of @* -> Constraint@ you can't pass @TupleConstraint 2@, because 'TupleConstraint' is partially
+applied and this is not allowed.
+
+But you can partially apply classes.
+
+So 'IsTuple' is basically the same as 'TupleConstraint' except that it's a class, not a type family.
+-}
+class (TupleConstraint n a) => IsTuple n a
+instance (TupleConstraint n a) => IsTuple n a
+
+{-|
+The version of 'IsTuple' for homogenous tuples (i.e. all the same type).
+-}
+class (HomoTupleConstraint n a) => IsHomoTuple n a
+instance (HomoTupleConstraint n a) => IsHomoTuple n a
