diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for brick-tabular-list
 
+## 2.2.0.0 -- 2023-03-28
+
+* Hide row header type in `RowHdr`.
+* Change the name of `ColHdrRowHdr` newtype constructor to improve readability.
+
 ## 2.1.0.0 -- 2023-03-16
 
 * Wrap `ColHdrRowHdr` in `Maybe` for semantic correctness.
diff --git a/brick-tabular-list.cabal b/brick-tabular-list.cabal
--- a/brick-tabular-list.cabal
+++ b/brick-tabular-list.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: brick-tabular-list
-version: 2.1.0.0
+version: 2.2.0.0
 
 synopsis: Tabular list widgets for brick.
 
diff --git a/demo/GridTabularList.hs b/demo/GridTabularList.hs
--- a/demo/GridTabularList.hs
+++ b/demo/GridTabularList.hs
@@ -45,7 +45,7 @@
 } deriving Generic
 
 type LibraryList = GridTabularList Name Song
-type LibraryRenderers = GridRenderers Name Song Int
+type LibraryRenderers = GridRenderers Name Song
 
 songs :: Seq Song
 songs = S.fromList $
@@ -112,7 +112,7 @@
 colSelectedAttr :: AttrName
 colSelectedAttr = attrName "selectedColumn"
 
-rowHdr :: RowHdr Name Song Int
+rowHdr :: RowHdr Name Song
 rowHdr = RowHdr {
   draw = \_ (WdthD wd) (RowHdrCtxt (Sel s)) r -> let
     attrFn = if s
@@ -157,7 +157,7 @@
       _ -> fill ' '
 , rowHdr = Just rowHdr
 , colHdr = Just colHdr
-, colHdrRowHdr = Just $ CHRH $ \_ _ -> vLimit 1 (fill ' ') <=> hBorder
+, colHdrRowHdr = Just $ ColHdrRowHdr $ \_ _ -> vLimit 1 (fill ' ') <=> hBorder
 }
 
 theList :: LibraryList
diff --git a/demo/MixedTabularList.hs b/demo/MixedTabularList.hs
--- a/demo/MixedTabularList.hs
+++ b/demo/MixedTabularList.hs
@@ -51,7 +51,7 @@
 } deriving Generic
 
 type LibraryList = MixedTabularList Name LibraryEntry Widths
-type LibraryRenderers = MixedRenderers Name LibraryEntry Widths Int
+type LibraryRenderers = MixedRenderers Name LibraryEntry Widths
 
 libraryEntries :: Seq LibraryEntry
 libraryEntries = let
@@ -140,7 +140,7 @@
   LibSong _ -> song
   LibFolder _ -> folder
 
-rowHdr :: RowHdr Name LibraryEntry Int
+rowHdr :: RowHdr Name LibraryEntry
 rowHdr = RowHdr {
   draw = \_ (WdthD wd) (RowHdrCtxt (Sel s)) rh -> let
     attrFn = if s
@@ -168,7 +168,7 @@
           cell = dc
         , rowHdr = Just rowHdr
         , colHdr = Just colHdr
-        , colHdrRowHdr = Just $ CHRH $ \_ _ -> vLimit 1 (fill ' ') <=> hBorder
+        , colHdrRowHdr = Just $ ColHdrRowHdr $ \_ _ -> vLimit 1 (fill ' ') <=> hBorder
         }
       , listWidth = 80
       }
diff --git a/src/Brick/Widgets/TabularList.hs b/src/Brick/Widgets/TabularList.hs
--- a/src/Brick/Widgets/TabularList.hs
+++ b/src/Brick/Widgets/TabularList.hs
@@ -10,12 +10,16 @@
 -- * Type Variables #TypeVariables#
 --
 -- $TypeVariables
--- * @__n__@ is the type of the resource name for the list. This is not for column headers because column headers are
+-- Shared type variables
+--
+-- * n - the type of the resource name for the list. This is not for column headers because column headers are
 -- above the list. Read [brick user guide](https://github.com/jtdaugherty/brick/blob/master/docs/guide.rst) for more
 -- details.
--- * @__e__@ is the type of list elements which are also called list rows in tabular list widgets.
--- * @__w__@ is the type that contains widths per row kind. mixed-tabular-list demo program shows how to utilize it.
--- * @__r__@ is the type for row headers. If you don't want to show row headers, set this to @__()__@ or 'Void'.
+-- * e - the type of list elements which are also called list rows in tabular list widgets.
+--
+-- Mixed type variables
+--
+-- * w - the type that contains widths per row kind. mixed-tabular-list demo program shows how to utilize it.
 
 -- * Rendering #Rendering#
 --
diff --git a/src/Brick/Widgets/TabularList/Grid.hs b/src/Brick/Widgets/TabularList/Grid.hs
--- a/src/Brick/Widgets/TabularList/Grid.hs
+++ b/src/Brick/Widgets/TabularList/Grid.hs
@@ -94,9 +94,9 @@
 --
 -- * [Type Variables]("Brick.Widgets.TabularList#g:TypeVariables")
 -- * [Rendering]("Brick.Widgets.TabularList#g:Rendering")
-data GridRenderers n e r = GridRenderers {
+data GridRenderers n e = GridRenderers {
   cell :: ListFocused -> WidthDeficit -> GridCtxt -> e -> Widget n
-, rowHdr :: Maybe (RowHdr n e r)
+, rowHdr :: Maybe (RowHdr n e)
 , colHdr :: Maybe (GridColHdr n)
 , colHdrRowHdr :: Maybe (ColHdrRowHdr n)
 } deriving Generic
@@ -128,7 +128,7 @@
 -- | Width accumulated in the process of traversing columns
 newtype AccWidth = AccW Int deriving (Eq, Show)
 
-data VisibleColumns =
+data VisibleGridColumns =
   -- | No column is visible
   NoColumn |
   -- | Only current column is visible
@@ -162,8 +162,8 @@
 -- | Calculate visible columns with the width available for columns. It tries to show the current column in the center.
 -- If it can't show the current column in the center, the first column is shown at the left corner, or the last column
 -- is shown at the right corner.
-visibleColumns :: GridTabularList n e -> AvailWidth -> VisibleColumns
-visibleColumns l (AvlW aW) = let
+visibleGridColumns :: GridTabularList n e -> AvailWidth -> VisibleGridColumns
+visibleGridColumns l (AvlW aW) = let
   (Ix curCol) = l ^. #currentColumn
   ws = l ^. #widths
   in case S.splitAt curCol ws of
@@ -222,13 +222,14 @@
 -- | Height for tabular list components
 newtype Height = H Int deriving (Eq, Show)
 
-renderColumns
+-- | Render column headers or row columns
+renderGridColumns
   :: GridTabularList n e
-  -> VisibleColumns
+  -> VisibleGridColumns
   -> (WidthDeficit -> Index -> ColWidth -> Widget n)
   -> Height
   -> Widget n
-renderColumns l vCs dC (H h) = Widget Greedy Fixed $ do
+renderGridColumns l vCs dC (H h) = Widget Greedy Fixed $ do
   c <- getContext
   let cWs = l ^. #widths
       Ix curCol = l ^. #currentColumn
@@ -246,7 +247,7 @@
 
 -- | Render grid tabular list
 renderGridTabularList :: (Ord n, Show n)
-  => GridRenderers n e r
+  => GridRenderers n e
   -> ListFocused
   -> GridTabularList n e -- ^ The list
   -> Widget n
@@ -261,21 +262,21 @@
         Nothing -> emptyWidget
         Just (GridColHdr {draw, height=ColHdrH chh}) -> let
           col wd c (ColW w) = sz (w, chh) $ draw (LstFcs f) wd $ GColC c $ Sel (c == curCol)
-          chrw = case r ^. #colHdrRowHdr of
+          chrh = case r ^. #colHdrRowHdr of
             Nothing -> fill ' '
-            Just (CHRH chrh) -> chrh (LstFcs f) (WdthD rhwd)
-          in sz (rhw, chh) chrw <+> renderColumns l vCs col (H chh)
+            Just (ColHdrRowHdr chrh) -> chrh (LstFcs f) (WdthD rhwd)
+          in sz (rhw, chh) chrh <+> renderGridColumns l vCs col (H chh)
       row vCs i f r = let
         col wd c (ColW w) = let gc = GrdCtxt (GRowC (Ix i) (Sel f)) $ GColC c $ Sel (c == curCol)
           in sz (w, iH) $ cell (LstFcs f) wd gc r
-        in renderColumns l vCs col (H iH)
-      lst = let vCs = visibleColumns l (AvlW aW) in
+        in renderGridColumns l vCs col (H iH)
+      lst = let vCs = visibleGridColumns l (AvlW aW) in
         render $ colHdrRow vCs (RowHdrW 0) (WdthD 0) <=> L.renderListWithIndex (row vCs) f l'
       hdrLst (RowHdr {draw=drw, width, toRH=tR}) = let
         RowHdrW rhw' = width (AvlW aW) $ uncurry (zipWith tR) $ visibleRowIdx l' (AvlH aH)
         rhw = min rhw' aW
         rhwd = WdthD $ max 0 $ rhw' - aW
-        vCs = visibleColumns l $ AvlW $ aW - rhw
+        vCs = visibleGridColumns l $ AvlW $ aW - rhw
         hdrRow i f r = sz (rhw, iH) (drw (LstFcs f) rhwd (RowHdrCtxt $ Sel f) $ tR r (Ix i)) <+> row vCs i f r
         in render $ colHdrRow vCs (RowHdrW rhw) rhwd <=> L.renderListWithIndex hdrRow f l'
   maybe lst hdrLst $ r ^. #rowHdr
@@ -323,8 +324,8 @@
 
 -- | 'GridRenderers' are needed because if row header renderer doesn't exist, width calculation is affected.
 gridMovePage :: Ord n
-  => GridRenderers n e r
-  -> (VisibleColumns -> EventM n (GridTabularList n e) ())
+  => GridRenderers n e
+  -> (VisibleGridColumns -> EventM n (GridTabularList n e) ())
   -> EventM n (GridTabularList n e) ()
 gridMovePage r f = do
   l <- get
@@ -338,13 +339,13 @@
         RowHdrW rhw = case r ^. #rowHdr of
           Nothing -> RowHdrW 0
           Just (RowHdr {width, toRH}) -> width (AvlW aW) $ uncurry (zipWith toRH) $ visibleRowIdx l' (AvlH aH)
-        in f $ visibleColumns l $ AvlW $ aW - rhw
+        in f $ visibleGridColumns l $ AvlW $ aW - rhw
 
 -- | Move to the previous page of columns.
 --
 -- 'GridRenderers' are needed because if row header doesn't exist, width calculation is affected.
 gridMovePageUp :: Ord n
-  => GridRenderers n e r -- ^ Renderers
+  => GridRenderers n e -- ^ Renderers
   -> EventM n (GridTabularList n e) ()
 gridMovePageUp r = gridMovePage r $ \case
   NoColumn -> return ()
@@ -357,7 +358,7 @@
 --
 -- 'GridRenderers' are needed because if row header doesn't exist, width calculation is affected.
 gridMovePageDown :: Ord n
-  => GridRenderers n e r -- ^ Renderers
+  => GridRenderers n e -- ^ Renderers
   -> EventM n (GridTabularList n e) ()
 gridMovePageDown r = gridMovePage r $ \case
   NoColumn -> return ()
@@ -379,7 +380,7 @@
 --
 -- 'GridRenderers' are needed because if row header doesn't exist, width calculation is affected.
 handleGridListEvent :: Ord n
-  => GridRenderers n e r -- ^ Renderers
+  => GridRenderers n e -- ^ Renderers
   -> Event -> EventM n (GridTabularList n e) ()
 handleGridListEvent r e = case e of
   EvKey KLeft [] -> modify gridMoveLeft
@@ -403,7 +404,7 @@
 --
 -- 'GridRenderers' are needed because if row header doesn't exist, width calculation is affected.
 handleGridListEventVi :: Ord n
-  => GridRenderers n e r -- ^ Renderers
+  => GridRenderers n e -- ^ Renderers
   -> Event -> EventM n (GridTabularList n e) ()
 handleGridListEventVi r e = case e of
   EvKey (KChar 'h') [] -> modify gridMoveLeft
diff --git a/src/Brick/Widgets/TabularList/Mixed.hs b/src/Brick/Widgets/TabularList/Mixed.hs
--- a/src/Brick/Widgets/TabularList/Mixed.hs
+++ b/src/Brick/Widgets/TabularList/Mixed.hs
@@ -84,9 +84,9 @@
 --
 -- * [Type Variables]("Brick.Widgets.TabularList#g:TypeVariables")
 -- * [Rendering]("Brick.Widgets.TabularList#g:Rendering")
-data MixedRenderers n e w r = MixedRenderers {
+data MixedRenderers n e w = MixedRenderers {
   cell :: ListFocused -> MixedCtxt -> e -> Widget n
-, rowHdr :: Maybe (RowHdr n e r)
+, rowHdr :: Maybe (RowHdr n e)
 , colHdr :: Maybe (MixedColHdr n w)
 , colHdrRowHdr :: Maybe (ColHdrRowHdr n)
 } deriving Generic
@@ -124,7 +124,7 @@
 
 -- | Render mixed tabular list.
 renderMixedTabularList :: (Show n, Ord n)
-  => MixedRenderers n e w r -- ^ Renderers
+  => MixedRenderers n e w -- ^ Renderers
   -> ListFocused
   -> MixedTabularList n e w -- ^ The list
   -> Widget n
@@ -139,10 +139,10 @@
         Nothing -> emptyWidget
         Just (MixedColHdr {draw, widths, height=ColHdrH chh}) -> let
           col ci (ColW w) = sz (w, chh) $ draw (LstFcs f) (MColC ci)
-          chrw = case r ^. #colHdrRowHdr of
+          chrh = case r ^. #colHdrRowHdr of
             Nothing -> fill ' '
-            Just (CHRH chrw) -> chrw (LstFcs f) (WdthD rhwd)
-          in sz (rhw, chh) chrw <+> hBox (zipWith col [Ix 0..] $ widths wprk)
+            Just (ColHdrRowHdr chrh) -> chrh (LstFcs f) (WdthD rhwd)
+          in sz (rhw, chh) chrh <+> hBox (zipWith col [Ix 0..] $ widths wprk)
       row wprk i f r = let
         col ci (ColW w) = sz (w, iH) $ cell (LstFcs f) (MxdCtxt (MRowC (Ix i) (Sel f)) $ MColC ci) r
         in hBox $ zipWith col [Ix 0..] $ wpr wprk r
diff --git a/src/Brick/Widgets/TabularList/Types.hs b/src/Brick/Widgets/TabularList/Types.hs
--- a/src/Brick/Widgets/TabularList/Types.hs
+++ b/src/Brick/Widgets/TabularList/Types.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE NoFieldSelectors #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE ExistentialQuantification #-}
 -- | Types shared by tabular list widgets.
 --
 -- You don't have to import this module because modules for tabular list widgets re-export this module.
@@ -83,16 +84,20 @@
 --
 -- * [Type Variables]("Brick.Widgets.TabularList#g:TypeVariables")
 -- * [Rendering]("Brick.Widgets.TabularList#g:Rendering")
-data RowHdr n e r = RowHdr {
+--
+-- Type Variables
+--
+-- * r - the type of row header
+data RowHdr n e = forall r. RowHdr {
   draw :: ListFocused -> WidthDeficit -> RowHdrCtxt -> r -> Widget n
   -- | Calculate row header width from visible row headers and the width available for a list row.
 , width :: AvailWidth -> [r] -> RowHdrWidth
   -- | Get a row header from a list row and row index.
 , toRH :: e -> Index -> r
-} deriving Generic
+}
 
 -- | The renderer for column header row header.
 --
 -- If row headers and column headers exist and 'ColHdrRowHdr' doesn't exist, then column header row header is filled
 -- with empty space. 'ColHdrRowHdr' merely allows you to customize column header row header.
-newtype ColHdrRowHdr n = CHRH (ListFocused -> WidthDeficit -> Widget n) deriving Generic
+newtype ColHdrRowHdr n = ColHdrRowHdr (ListFocused -> WidthDeficit -> Widget n) deriving Generic
