diff --git a/dataframe.cabal b/dataframe.cabal
--- a/dataframe.cabal
+++ b/dataframe.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.4
 name:               dataframe
-version:            3.4.0.0
+version:            3.5.0.0
 synopsis: A fast, safe, and intuitive DataFrame library.
 
 description: A fast, safe, and intuitive DataFrame library for exploratory data analysis.
@@ -128,13 +128,13 @@
                         DataFrame.Typed.Record,
                         DataFrame.Typed.Generic
     build-depends:    base >= 4 && <5,
-                      dataframe-core >= 2.3 && < 2.4,
+                      dataframe-core >= 2.4 && < 2.5,
                       dataframe-json >= 1.2.0.1 && < 1.3,
                       dataframe-expr-serializer >= 1.2.0.1 && < 1.3,
-                      dataframe-operations >= 2.3 && < 2.4,
+                      dataframe-operations >= 2.4 && < 2.5,
                       dataframe-parsing >= 2.2 && < 2.3,
                       dataframe-viz >= 1.3 && < 1.4,
-                      dataframe-learn >= 2.3 && < 2.4
+                      dataframe-learn >= 2.4 && < 2.5
 
     if !flag(no-csv)
         reexported-modules: DataFrame.IO.CSV,
@@ -167,7 +167,7 @@
                             DataFrame.Lazy.IO.Binary,
                             DataFrame.Lazy.IO.CSV,
                             DataFrame.Typed.Lazy
-        build-depends:   dataframe-lazy >= 2.3 && < 2.4
+        build-depends:   dataframe-lazy >= 2.4 && < 2.5
         cpp-options:     -DWITH_LAZY
 
     if !flag(no-th)
@@ -203,12 +203,12 @@
         buildable: False
     build-depends:
         base        >= 4   && < 5,
-        dataframe-core >= 2.3 && < 2.4,
+        dataframe-core >= 2.4 && < 2.5,
         dataframe-expr-serializer >= 1.2.0.1 && < 1.3,
         dataframe-csv >= 2.3 && < 2.4,
         dataframe-json >= 1.2.0.1 && < 1.3,
-        dataframe-lazy >= 2.3 && < 2.4,
-        dataframe-operations >= 2.3 && < 2.4,
+        dataframe-lazy >= 2.4 && < 2.5,
+        dataframe-operations >= 2.4 && < 2.5,
         dataframe-parquet >= 1.5 && < 1.6,
         dataframe-parsing >= 2.2 && < 2.3,
         text        >= 2.1 && < 3,
@@ -223,8 +223,8 @@
     import: warnings
     main-is: Benchmark.hs
     build-depends:    base >= 4 && < 5,
-                      dataframe >= 3.4 && < 3.5,
-                      dataframe-operations >= 2.3 && < 2.4,
+                      dataframe >= 3.5 && < 3.6,
+                      dataframe-operations >= 2.4 && < 2.5,
                       random >= 1 && < 2,
                       time >= 1.12 && < 2,
                       vector >= 0.13 && < 0.15,
@@ -236,10 +236,10 @@
     import: warnings
     main-is: Synthesis.hs
     build-depends:    base >= 4 && < 5,
-                      dataframe >= 3.4 && < 3.5,
-                      dataframe-core >= 2.3 && < 2.4,
-                      dataframe-learn >= 2.3 && < 2.4,
-                      dataframe-operations >= 2.3 && < 2.4,
+                      dataframe >= 3.5 && < 3.6,
+                      dataframe-core >= 2.4 && < 2.5,
+                      dataframe-learn >= 2.4 && < 2.5,
+                      dataframe-operations >= 2.4 && < 2.5,
                       random >= 1 && < 2,
                       text >= 2.1 && < 3
     hs-source-dirs:   app
@@ -270,9 +270,9 @@
     build-depends:    base >= 4 && < 5,
                       bytestring >= 0.11 && < 0.14,
                       containers >= 0.6.7 && < 0.10,
-                      dataframe >= 3.4 && < 3.5,
-                      dataframe-core >= 2.3 && < 2.4,
-                      dataframe-lazy >= 2.3 && < 2.4,
+                      dataframe >= 3.5 && < 3.6,
+                      dataframe-core >= 2.4 && < 2.5,
+                      dataframe-lazy >= 2.4 && < 2.5,
                       dataframe-parsing >= 2.2 && < 2.3,
                       directory >= 1.3.0.0 && < 2,
                       random >= 1 && < 2,
@@ -291,9 +291,9 @@
                    criterion >= 1 && < 2,
                    deepseq >= 1.4 && < 2,
                    process >= 1.6 && < 2,
-                   dataframe >= 3.4 && < 3.5,
-                   dataframe-core >= 2.3 && < 2.4,
-                   dataframe-operations >= 2.3 && < 2.4,
+                   dataframe >= 3.5 && < 3.6,
+                   dataframe-core >= 2.4 && < 2.5,
+                   dataframe-operations >= 2.4 && < 2.5,
                    random >= 1 && < 2,
     default-language: Haskell2010
     ghc-options:
@@ -377,16 +377,16 @@
     build-depends:  base >= 4 && < 5,
                     aeson >= 0.11.0.0 && < 3,
                     bytestring >= 0.11 && < 0.14,
-                    dataframe >= 3.4 && < 3.5,
-                    dataframe-core >= 2.3 && < 2.4,
-                    dataframe-core >= 2.3 && < 2.4,
+                    dataframe >= 3.5 && < 3.6,
+                    dataframe-core >= 2.4 && < 2.5,
+                    dataframe-core >= 2.4 && < 2.5,
                     dataframe-csv >= 2.3 && < 2.4,
                     dataframe-expr-serializer >= 1.2.0.1 && < 1.3,
                     dataframe-fastcsv >= 1.4.0.1 && < 1.5,
                     dataframe-json >= 1.2.0.1 && < 1.3,
-                    dataframe-lazy >= 2.3 && < 2.4,
-                    dataframe-learn >= 2.3 && < 2.4,
-                    dataframe-operations >= 2.3 && < 2.4,
+                    dataframe-lazy >= 2.4 && < 2.5,
+                    dataframe-learn >= 2.4 && < 2.5,
+                    dataframe-operations >= 2.4 && < 2.5,
                     dataframe-parquet >= 1.5 && < 1.6,
                     dataframe-parsing >= 2.2 && < 2.3,
                     HUnit >= 1.6 && < 1.8,
@@ -413,9 +413,9 @@
     other-modules: Internal.PackedText
     build-depends:  base >= 4 && < 5,
                     bytestring >= 0.11 && < 0.14,
-                    dataframe >= 3.4 && < 3.5,
-                    dataframe-core >= 2.3 && < 2.4,
-                    dataframe-operations >= 2.3 && < 2.4,
+                    dataframe >= 3.5 && < 3.6,
+                    dataframe-core >= 2.4 && < 2.5,
+                    dataframe-operations >= 2.4 && < 2.5,
                     HUnit >= 1.6 && < 1.8,
                     text >= 2.1 && < 3,
                     vector >= 0.13 && < 0.15
diff --git a/ffi/DataFrame/IR.hs b/ffi/DataFrame/IR.hs
--- a/ffi/DataFrame/IR.hs
+++ b/ffi/DataFrame/IR.hs
@@ -46,7 +46,11 @@
 import DataFrame.IO.JSON (readJSON)
 import qualified DataFrame.IO.Parquet as Parquet
 import DataFrame.IR.ExprJson (SomeExpr (..), decodeExprAny, decodeExprAt)
-import DataFrame.Internal.Column (Column (..), Columnable)
+import DataFrame.Internal.Column (
+    Column (..),
+    Columnable,
+    mergedHead,
+ )
 import DataFrame.Internal.DataFrame (DataFrame, unsafeGetColumn)
 import DataFrame.Internal.Expression (Expr (..), NamedExpr)
 import qualified DataFrame.Lazy as Lazy
@@ -256,6 +260,7 @@
     columnTypeRep (UnboxedColumn _ (_ :: VU.Vector a)) = SomeTypeRep (typeRep @a)
     columnTypeRep (BoxedColumn _ (_ :: V.Vector a)) = SomeTypeRep (typeRep @a)
     columnTypeRep (PackedText _ _) = SomeTypeRep (typeRep @T.Text)
+    columnTypeRep c@(MergedColumn _ _) = columnTypeRep (mergedHead c)
     mk :: (Columnable a, Ord a) => Expr a -> SortOrder
     mk = if isAsc then Asc else Desc
     dispatchType (SomeTypeRep tr)
@@ -334,6 +339,7 @@
     columnTypeRep (UnboxedColumn _ (_ :: VU.Vector a)) = SomeTypeRep (typeRep @a)
     columnTypeRep (BoxedColumn _ (_ :: V.Vector a)) = SomeTypeRep (typeRep @a)
     columnTypeRep (PackedText _ _) = SomeTypeRep (typeRep @T.Text)
+    columnTypeRep c@(MergedColumn _ _) = columnTypeRep (mergedHead c)
 
     fr :: forall a. (Columnable a, Ord a) => IO DataFrame
     fr = return $ Stats.frequencies (Col @a colName) df
@@ -370,6 +376,7 @@
 countExpr name colName (BoxedColumn (Just _) (_ :: V.Vector a)) = return $ name .= count (Col @(Maybe a) colName)
 countExpr name colName (PackedText Nothing _) = return $ name .= count (Col @T.Text colName)
 countExpr name colName (PackedText (Just _) _) = return $ name .= count (Col @(Maybe T.Text) colName)
+countExpr name colName c@(MergedColumn _ _) = countExpr name colName (mergedHead c)
 
 sumExpr :: T.Text -> T.Text -> Column -> IO NamedExpr
 sumExpr name colName (UnboxedColumn Nothing (_ :: VU.Vector a))
