diff --git a/dataframe-learn.cabal b/dataframe-learn.cabal
--- a/dataframe-learn.cabal
+++ b/dataframe-learn.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.4
 name:               dataframe-learn
-version:            2.4.0.0
+version:            2.4.1.0
 synopsis:           Interpretable, expression-returning machine learning for the dataframe ecosystem.
 description:
     A small scikit-learn-style ML library where every model returns both an
@@ -61,8 +61,8 @@
                         containers >= 0.6.7 && < 0.10,
                         parallel >= 3.3 && < 4,
                         random >= 1.2 && < 2,
-                        dataframe-core >= 2.3 && < 2.4,
-                        dataframe-operations >= 2.3 && < 2.4,
+                        dataframe-core >= 2.4 && < 2.5,
+                        dataframe-operations >= 2.4 && < 2.5,
                         text >= 2.1 && < 3,
                         vector >= 0.13 && < 0.15,
                         vector-algorithms >= 0.9 && < 0.11
@@ -105,10 +105,10 @@
                         containers >= 0.6.7 && < 0.10,
                         parallel >= 3.3 && < 4,
                         random >= 1.2 && < 2,
-                        dataframe-core >= 2.3 && < 2.4,
-                        dataframe-core >= 2.3 && < 2.4,
-                        dataframe-operations >= 2.3 && < 2.4,
-                        dataframe-operations >= 2.3 && < 2.4,
+                        dataframe-core >= 2.4 && < 2.5,
+                        dataframe-core >= 2.4 && < 2.5,
+                        dataframe-operations >= 2.4 && < 2.5,
+                        dataframe-operations >= 2.4 && < 2.5,
                         dataframe-expr-serializer >= 1.2.0.1 && < 1.3,
                         dataframe-learn:internal,
                         text >= 2.1 && < 3,
@@ -140,13 +140,13 @@
                         aeson >= 0.11.0.0 && < 3,
                         bytestring >= 0.11 && < 0.14,
                         containers >= 0.6.7 && < 0.10,
-                        dataframe-core >= 2.3 && < 2.4,
-                        dataframe-core >= 2.3 && < 2.4,
+                        dataframe-core >= 2.4 && < 2.5,
+                        dataframe-core >= 2.4 && < 2.5,
                         dataframe-csv >= 2.3 && < 2.4,
                         dataframe-learn,
                         dataframe-learn:internal,
-                        dataframe-operations >= 2.3 && < 2.4,
-                        dataframe-operations >= 2.3 && < 2.4,
+                        dataframe-operations >= 2.4 && < 2.5,
+                        dataframe-operations >= 2.4 && < 2.5,
                         HUnit >= 1.6 && < 1.8,
                         QuickCheck >= 2 && < 3,
                         random >= 1 && < 2,
diff --git a/src-internal/DataFrame/DecisionTree/Cart.hs b/src-internal/DataFrame/DecisionTree/Cart.hs
--- a/src-internal/DataFrame/DecisionTree/Cart.hs
+++ b/src-internal/DataFrame/DecisionTree/Cart.hs
@@ -273,6 +273,9 @@
     pt@(PackedText _ _) -> case materializePacked pt of
         BoxedColumn _ (v :: V.Vector b) -> oneHotFeatures @b (nRows df) c v
         _ -> []
+    mc@(MergedColumn _ _) -> case materializeMerged mc of
+        BoxedColumn _ (v :: V.Vector b) -> oneHotFeatures @b (nRows df) c v
+        _ -> []
 
 numericFeature ::
     forall b. (Columnable b, VU.Unbox b) => T.Text -> VU.Vector b -> [CartFeature]
@@ -304,6 +307,11 @@
         Nothing -> V.map (T.pack . show) v
     UnboxedColumn _ (v :: VU.Vector b) -> V.map (T.pack . show) (V.convert v)
     pt@(PackedText _ _) -> case materializePacked pt of
+        BoxedColumn _ (v :: V.Vector b) -> case testEquality (typeRep @b) (typeRep @T.Text) of
+            Just Refl -> v
+            Nothing -> V.map (T.pack . show) v
+        _ -> V.empty
+    mc@(MergedColumn _ _) -> case materializeMerged mc of
         BoxedColumn _ (v :: V.Vector b) -> case testEquality (typeRep @b) (typeRep @T.Text) of
             Just Refl -> v
             Nothing -> V.map (T.pack . show) v
diff --git a/src-internal/DataFrame/DecisionTree/Categorical.hs b/src-internal/DataFrame/DecisionTree/Categorical.hs
--- a/src-internal/DataFrame/DecisionTree/Categorical.hs
+++ b/src-internal/DataFrame/DecisionTree/Categorical.hs
@@ -247,6 +247,10 @@
         BoxedColumn Nothing (column :: V.Vector a) -> nonNullColConds ctx colName column
         BoxedColumn (Just bm) (column :: V.Vector a) -> nullableColConds ctx colName bm column
         _ -> []
+    mc@(MergedColumn _ _) -> case materializeMerged mc of
+        BoxedColumn Nothing (column :: V.Vector a) -> nonNullColConds ctx colName column
+        BoxedColumn (Just bm) (column :: V.Vector a) -> nullableColConds ctx colName bm column
+        _ -> []
 
 nonNullColConds ::
     forall a target.
@@ -360,6 +364,10 @@
     BoxedColumn (Just bm) (column :: V.Vector a) -> mapMaybe (materializeCondVec df) (nullableColConds ctx colName bm column)
     UnboxedColumn _ (_ :: VU.Vector a) -> []
     pt@(PackedText _ _) -> case materializePacked pt of
+        BoxedColumn Nothing (column :: V.Vector a) -> nonNullColCondVecs ctx colName column
+        BoxedColumn (Just bm) (column :: V.Vector a) -> mapMaybe (materializeCondVec df) (nullableColConds ctx colName bm column)
+        _ -> []
+    mc@(MergedColumn _ _) -> case materializeMerged mc of
         BoxedColumn Nothing (column :: V.Vector a) -> nonNullColCondVecs ctx colName column
         BoxedColumn (Just bm) (column :: V.Vector a) -> mapMaybe (materializeCondVec df) (nullableColConds ctx colName bm column)
         _ -> []
