diff --git a/src/Data/TypeLevel/Tuple/Index.hs b/src/Data/TypeLevel/Tuple/Index.hs
--- a/src/Data/TypeLevel/Tuple/Index.hs
+++ b/src/Data/TypeLevel/Tuple/Index.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE DataKinds, PolyKinds #-}
 {-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
@@ -7,4 +8,7 @@
 
 import Data.TypeLevel.Tuple.Index.TH
 
-uncurry mkI `mapM` [ (i, n) | n <- [2 .. 15], i <- [0 .. n - 1] ]
+uncurry mkI `mapM` reverse [ (i, n) | n <- [2 .. 15], i <- [0 .. n - 1] ]
+
+uncurry mkITup `mapM`
+	(concatMap (\n -> (, n) <$> reverse (mTupIndices n)) $ reverse [3 .. 8])
diff --git a/src/Data/TypeLevel/Tuple/Index/TH.hs b/src/Data/TypeLevel/Tuple/Index/TH.hs
--- a/src/Data/TypeLevel/Tuple/Index/TH.hs
+++ b/src/Data/TypeLevel/Tuple/Index/TH.hs
@@ -1,11 +1,13 @@
+{-# LANGUAGE ImportQualifiedPost #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE DataKinds, PolyKinds #-}
 {-# LANGUAGE KindSignatures #-}
 {-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
 
-module Data.TypeLevel.Tuple.Index.TH (mkI) where
+module Data.TypeLevel.Tuple.Index.TH (mkI, mkITup, mTupIndices) where
 
+import Data.List qualified as L
 import Language.Haskell.TH
 
 mkI :: Int -> Int -> DecQ
@@ -37,3 +39,35 @@
 
 kindNames :: [String]
 kindNames = ('k' :) . show <$> [0 :: Int ..]
+
+mkITup :: [Int] -> Int -> DecQ
+mkITup is n = do
+	xyzs <- newName . concat $ take n varNames
+	vs <- newName `mapM` take n varNames
+	ks <- newName `mapM` take n kindNames
+	bazRaw nm xyzs ks vs is
+	where
+	nm = mkName $ "I" ++ L.intercalate "'" (show <$> is) ++ "_" ++ show n
+
+bazRaw :: Name -> Name -> [Name] -> [Name] -> [Int] -> DecQ
+bazRaw tn xyzs ks vs is = closedTypeFamilyD tn
+	[kindedTV xyzs . tuple' $ varK <$> ks]
+	noSig Nothing
+	[	tySynEqn Nothing
+			(conT tn `appT` promotedTuple (varT <$> vs))
+			(promotedTuple (varT . (vs !!) <$> is))
+		]
+
+tuple' :: [Kind] -> Kind
+tuple' ts = foldl appK (tupleK $ length ts) ts
+
+promotedTuple :: [TypeQ] -> TypeQ
+promotedTuple ts = foldl appT (promotedTupleT $ length ts) ts
+
+mTupIndices :: Int -> [[Int]]
+mTupIndices n = filter ((`notElem` [0, 1, n]) . length) $ combinations [0 .. n - 1]
+
+combinations :: [a] -> [[a]]
+combinations [] = [[]]
+combinations (x : xs) = ((x :) <$> combinations xs) ++ combinations xs
+-- combinations (x : xs) = combinations xs ++ ((x :) <$> combinations xs)
diff --git a/typelevel-tools-yj.cabal b/typelevel-tools-yj.cabal
--- a/typelevel-tools-yj.cabal
+++ b/typelevel-tools-yj.cabal
@@ -1,13 +1,13 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.36.0.
+-- This file has been generated from package.yaml by hpack version 0.37.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           typelevel-tools-yj
-version:        0.1.0.7
+version:        0.1.0.8
 synopsis:       type level tools
-description:    Please see the README on GitHub at <https://github.com/YoshikuniJujo/typelevel-tools#readme>
+description:    Please see the README on GitHub at <https://github.com/YoshikuniJujo/typelevel-tools-yj#readme>
 category:       Types
 homepage:       https://github.com/YoshikuniJujo/typelevel-tools-yj#readme
 bug-reports:    https://github.com/YoshikuniJujo/typelevel-tools-yj/issues
