diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+v0.4.4.2
+* Bumped upper bounds in cabal
+
 v 0.4.1.1
 * Bumped some upper bounds
 
diff --git a/Frames-map-reduce.cabal b/Frames-map-reduce.cabal
--- a/Frames-map-reduce.cabal
+++ b/Frames-map-reduce.cabal
@@ -1,7 +1,7 @@
 cabal-version:       2.2
 
 name:                Frames-map-reduce
-version:             0.4.1.1
+version:             0.4.1.2
 synopsis:            Frames wrapper for map-reduce-folds and some extra folds helpers.
 description:         Frames-map-reduce provides some helpers for using the map-reduce-folds library with vinyl records and Frames.
                      These include functions for filtering Frames, splitting records into key columns and data columns and
@@ -36,12 +36,12 @@
                  , Frames.Aggregation.Maybe
 
   build-depends: Frames               >= 0.6.1 && < 0.8,
-                 base                 >= 4.12.0 && < 4.17,
+                 base                 >= 4.12.0 && < 5,
                  containers           >= 0.5.0 && < 0.7,
-                 hashable             >= 1.2.7 && < 1.4,
+                 hashable             >= 1.2.7 && < 1.6,
                  map-reduce-folds     >= 0.1.0 && < 0.2,
                  profunctors          >= 5.3 && < 5.7,
-                 vinyl                >= 0.11.0 && < 0.14,
+                 vinyl                >= 0.11.0 && < 0.15,
                  foldl                >= 1.4.5 && < 1.5,
                  newtype              >= 0.2 && < 0.3
   hs-source-dirs:      src
@@ -57,7 +57,7 @@
                   foldl,
                   Frames,
                   Frames-map-reduce,
-                  text >= 1.2.3 && < 1.3,
+                  text >= 1.2.3 && < 2.2,
                   vector,
                   vinyl,
                   random >= 1.2 && < 1.3,
diff --git a/src/Frames/Aggregation.hs b/src/Frames/Aggregation.hs
--- a/src/Frames/Aggregation.hs
+++ b/src/Frames/Aggregation.hs
@@ -108,14 +108,7 @@
 -- perform a weighted-sum over the percentages.
 aggregateAllFold
   :: forall ak ak' d
-   . ( (ak' V.++ d) F.⊆ ((ak V.++ d) V.++ ak')
-     , ak F.⊆ (ak V.++ d)
-     , ak' F.⊆ (ak' V.++ d)
-     , d F.⊆ (ak' V.++ d)
-     , Ord (F.Record ak')
-     , Ord (F.Record ak)
-     , FI.RecVec (ak' V.++ d)
-     )
+   . AggregateAllC ak ak' d
   => RecordKeyMap ak ak' -- ^ get aggregated key from key
   -> (FL.Fold (F.Record d) (F.Record d)) -- ^ aggregate data
   -> FL.Fold (F.Record (ak V.++ d)) (F.FrameRec (ak' V.++ d))
diff --git a/src/Frames/MapReduce.hs b/src/Frames/MapReduce.hs
--- a/src/Frames/MapReduce.hs
+++ b/src/Frames/MapReduce.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DeriveGeneric         #-}
 {-# LANGUAGE FlexibleContexts      #-}
@@ -67,7 +68,17 @@
 import qualified Data.Vinyl                    as V
 import qualified Data.Vinyl.TypeLevel          as V
 
+#if MIN_VERSION_base(4,16,0)
+import GHC.Generics (Generic, Rep)
+import Data.Hashable.Generic as Hash
+#endif
+
 -- | This is only here so we can use hash maps for the grouping step.  This should properly be in Frames itself.
+#if MIN_VERSION_base(4,16,0)
+instance (Generic (V.Rec V.ElField rs), Eq (V.Rec V.ElField rs), Hash.GHashable Hash.Zero (Rep (V.Rec V.ElField rs))) => Hash.Hashable (V.Rec V.ElField rs) where
+  hashWithSalt = Hash.genericHashWithSalt
+  {-# INLINEABLE hashWithSalt #-}
+#else
 instance Hash.Hashable (F.Record '[]) where
   hash = const 0
   {-# INLINABLE hash #-}
@@ -77,8 +88,8 @@
 instance (V.KnownField t, Hash.Hashable (V.Snd t), Hash.Hashable (F.Record rs), rs F.⊆ (t ': rs)) => Hash.Hashable (F.Record (t ': rs)) where
   hashWithSalt s r = s `Hash.hashWithSalt` (F.rgetField @t r) `Hash.hashWithSalt` (F.rcast @rs r)
   {-# INLINABLE hashWithSalt #-}
-
--- | Filter records using a function on the entire record. 
+#endif
+-- | Filter records using a function on the entire record.
 unpackFilterRow
   :: (F.Record rs -> Bool) -> MR.Unpack (F.Record rs) (F.Record rs)
 unpackFilterRow test = MR.Filter test
diff --git a/src/Frames/MapReduce/General.hs b/src/Frames/MapReduce/General.hs
--- a/src/Frames/MapReduce/General.hs
+++ b/src/Frames/MapReduce/General.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE AllowAmbiguousTypes   #-}
 {-# LANGUAGE ConstraintKinds       #-}
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DeriveGeneric         #-}
 {-# LANGUAGE FlexibleContexts      #-}
@@ -88,7 +89,11 @@
 
 instance (V.NatToInt (V.RLength rs)
          , V.RecApplicative rs
-         , V.RPureConstrained (V.IndexableField rs) rs) => IsoRec rs V.ARec f where
+         , V.RPureConstrained (V.IndexableField rs) rs
+#if MIN_VERSION_vinyl(0,14,2)
+         , V.ToARec rs
+#endif
+         ) => IsoRec rs V.ARec f where
   toRec = V.fromARec
   fromRec = V.toARec
 
@@ -104,27 +109,35 @@
     `V.rappend` (toRec @bs @record @f rhs)
 
 -- | This is only here so we can use hash maps for the grouping step.  This should properly be in Frames itself.
+#if MIN_VERSION_hashable(1,4,0)
+instance Eq (record (f :. ElField) '[]) => Hash.Hashable (record (f :. ElField)  '[]) where
+#else
 instance Hash.Hashable (record (f :. ElField)  '[]) where
+#endif
   hash = const 0
   {-# INLINABLE hash #-}
   hashWithSalt s = const s -- TODO: this seems BAD! Or not?
   {-# INLINABLE hashWithSalt #-}
 
+
 instance (V.KnownField t
          , Functor f
          , RecGetFieldC t record f (t ': rs)
          , RCastC rs (t ': rs) record f
+#if  MIN_VERSION_hashable(1,4,0)
+         , Eq (record (f :. ElField) (t ': rs))
+#endif
          , Hash.Hashable (f (V.Snd t))
          , Hash.Hashable (record (f :. ElField) rs)
          ) => Hash.Hashable (record (f :. ElField) (t ': rs)) where
   hashWithSalt s r = s `Hash.hashWithSalt` (rgetFieldF @t r) `Hash.hashWithSalt` (rcastF @rs r)
   {-# INLINABLE hashWithSalt #-}
 
--- | Don't do anything 
+-- | Don't do anything
 unpackNoOp :: MR.Unpack (record (f :. ElField) rs) (record (f :. ElField) rs)
 unpackNoOp = MR.Filter (const True)
 
--- | Filter records using a function on the entire record. 
+-- | Filter records using a function on the entire record.
 unpackFilterRow
   :: (record (f :. ElField) rs -> Bool)
   -> MR.Unpack (record (f :. ElField) rs) (record (f :. ElField) rs)
@@ -270,5 +283,3 @@
  where
   addKey k = fmap (\y -> fromRec . V.rappend (toRec k) . toRec $ makeRec y)
 {-# INLINABLE makeRecsWithKeyM #-}
-
-
