diff --git a/fastmemo.cabal b/fastmemo.cabal
--- a/fastmemo.cabal
+++ b/fastmemo.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.34.4.
+-- This file has been generated from package.yaml by hpack version 0.35.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           fastmemo
-version:        0.1.0.1
+version:        0.1.1
 synopsis:       Memoize functions on Generic types
 description:    Please see the README on GitHub at <https://github.com/davidspies/fastmemo#readme>
 category:       Memoization
@@ -31,9 +31,11 @@
       Data.Function.FastMemo.ByteString
       Data.Function.FastMemo.Char
       Data.Function.FastMemo.Class
+      Data.Function.FastMemo.Containers
       Data.Function.FastMemo.Instances
       Data.Function.FastMemo.Int
       Data.Function.FastMemo.Integer
+      Data.Function.FastMemo.List
       Data.Function.FastMemo.Natural
       Data.Function.FastMemo.Ratio
       Data.Function.FastMemo.Util
@@ -44,10 +46,11 @@
       src
   ghc-options: -Wall
   build-depends:
-      base >=4.7 && <4.16
-    , bytestring ==0.10.*
+      base >=4.7 && <4.18
+    , bytestring >=0.10 && <0.12
+    , containers ==0.6.*
     , utf8-string ==1.0.*
-    , vector ==0.12.*
+    , vector >=0.12 && <0.14
   default-language: Haskell2010
 
 test-suite fastmemo-test
@@ -61,9 +64,10 @@
   ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
   build-depends:
       QuickCheck
-    , base >=4.7 && <4.16
-    , bytestring ==0.10.*
+    , base >=4.7 && <4.18
+    , bytestring >=0.10 && <0.12
+    , containers ==0.6.*
     , fastmemo
     , utf8-string ==1.0.*
-    , vector ==0.12.*
+    , vector >=0.12 && <0.14
   default-language: Haskell2010
diff --git a/src/Data/Function/FastMemo.hs b/src/Data/Function/FastMemo.hs
--- a/src/Data/Function/FastMemo.hs
+++ b/src/Data/Function/FastMemo.hs
@@ -1,16 +1,16 @@
-{-# OPTIONS_GHC -Wno-orphans #-}
-
 -- |
 -- Straightforward function memoization library;
 -- see [Examples](https://github.com/davidspies/fastmemo/blob/master/test/Examples.hs) for example usage
-module Data.Function.FastMemo (Memoizable (..), memoizeFixedLen, memo1, memo2, memo3, memo4, memo5, memo6, memo7) where
+module Data.Function.FastMemo (AsList (..), Memoizable (..), memoizeFixedLen, memo1, memo2, memo3, memo4, memo5, memo6, memo7) where
 
 import Data.Function.FastMemo.ByteString ()
 import Data.Function.FastMemo.Char ()
 import Data.Function.FastMemo.Class (Memoizable (..))
+import Data.Function.FastMemo.Containers ()
 import Data.Function.FastMemo.Instances ()
 import Data.Function.FastMemo.Int ()
 import Data.Function.FastMemo.Integer ()
+import Data.Function.FastMemo.List (AsList (..))
 import Data.Function.FastMemo.Natural ()
 import Data.Function.FastMemo.Ratio ()
 import Data.Function.FastMemo.Util (memoizeFixedLen)
diff --git a/src/Data/Function/FastMemo/ByteString.hs b/src/Data/Function/FastMemo/ByteString.hs
--- a/src/Data/Function/FastMemo/ByteString.hs
+++ b/src/Data/Function/FastMemo/ByteString.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE StandaloneDeriving #-}
 {-# OPTIONS_GHC -Wno-orphans #-}
 
 module Data.Function.FastMemo.ByteString () where
@@ -5,10 +7,9 @@
 import qualified Data.ByteString as SBS
 import qualified Data.ByteString.Lazy as LBS
 import Data.Function.FastMemo.Class (Memoizable (..))
+import Data.Function.FastMemo.List (AsList (..))
 import Data.Function.FastMemo.Word ()
 
-instance Memoizable SBS.ByteString where
-  memoize f = memoize (f . SBS.pack) . SBS.unpack
+deriving via (AsList SBS.ByteString) instance Memoizable SBS.ByteString
 
-instance Memoizable LBS.ByteString where
-  memoize f = memoize (f . LBS.pack) . LBS.unpack
+deriving via (AsList LBS.ByteString) instance Memoizable LBS.ByteString
diff --git a/src/Data/Function/FastMemo/Class.hs b/src/Data/Function/FastMemo/Class.hs
--- a/src/Data/Function/FastMemo/Class.hs
+++ b/src/Data/Function/FastMemo/Class.hs
@@ -6,7 +6,6 @@
 
 module Data.Function.FastMemo.Class (Memoizable (..)) where
 
-import Data.List.NonEmpty (NonEmpty)
 import GHC.Generics
 
 class Memoizable a where
@@ -21,7 +20,7 @@
   gMemoize f = gMemoize (f . M1) . unM1
 
 instance GMemoize V1 where
-  gMemoize _f = \case
+  gMemoize _f = \case {}
 
 instance GMemoize U1 where
   gMemoize f = let fu = f U1 in \U1 -> fu
@@ -43,7 +42,3 @@
           R1 x -> fR x
 
 instance (Memoizable a, Memoizable b) => Memoizable (a, b)
-
-instance Memoizable a => Memoizable [a]
-
-instance Memoizable a => Memoizable (NonEmpty a)
diff --git a/src/Data/Function/FastMemo/Containers.hs b/src/Data/Function/FastMemo/Containers.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Function/FastMemo/Containers.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+module Data.Function.FastMemo.Containers () where
+
+import Data.Function.FastMemo.Class (Memoizable (..))
+import Data.Function.FastMemo.Int ()
+import Data.Function.FastMemo.List (AsList (..))
+import Data.IntMap (IntMap)
+import Data.IntSet (IntSet)
+import Data.Map (Map)
+import Data.Sequence (Seq)
+import qualified Data.Sequence as Seq
+import Data.Set (Set)
+import Data.Tree (Tree)
+
+deriving via AsList (Map a b) instance (Ord a, Memoizable a, Memoizable b) => Memoizable (Map a b)
+
+deriving via AsList (Set a) instance (Ord a, Memoizable a) => Memoizable (Set a)
+
+deriving via AsList (IntMap b) instance (Memoizable b) => Memoizable (IntMap b)
+
+deriving via AsList IntSet instance Memoizable IntSet
+
+deriving via AsList (Seq a) instance Memoizable a => Memoizable (Seq a)
+
+instance Memoizable a => Memoizable (Seq.ViewL a)
+
+instance Memoizable a => Memoizable (Seq.ViewR a)
+
+instance Memoizable a => Memoizable (Tree a)
diff --git a/src/Data/Function/FastMemo/Instances.hs b/src/Data/Function/FastMemo/Instances.hs
--- a/src/Data/Function/FastMemo/Instances.hs
+++ b/src/Data/Function/FastMemo/Instances.hs
@@ -6,6 +6,7 @@
 import Data.Function.FastMemo.Char ()
 import Data.Function.FastMemo.Class (Memoizable)
 import Data.Function.FastMemo.Int ()
+import Data.Function.FastMemo.List ()
 import Data.Functor.Identity (Identity)
 import Data.Proxy (Proxy)
 import Data.Version (Version)
diff --git a/src/Data/Function/FastMemo/List.hs b/src/Data/Function/FastMemo/List.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Function/FastMemo/List.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+module Data.Function.FastMemo.List (AsList (..)) where
+
+import Data.Function.FastMemo.Class (Memoizable (..))
+import Data.List.NonEmpty (NonEmpty)
+import GHC.Exts
+import qualified GHC.Exts as IsList
+
+instance Memoizable a => Memoizable [a]
+
+instance Memoizable a => Memoizable (NonEmpty a)
+
+newtype AsList t = AsList {unAsList :: t}
+
+instance (IsList t, Memoizable (IsList.Item t)) => Memoizable (AsList t) where
+  memoize f = memoize (f . AsList . IsList.fromList) . IsList.toList . unAsList
diff --git a/src/Data/Function/FastMemo/Natural.hs b/src/Data/Function/FastMemo/Natural.hs
--- a/src/Data/Function/FastMemo/Natural.hs
+++ b/src/Data/Function/FastMemo/Natural.hs
@@ -5,6 +5,7 @@
 import Data.Bits (shiftL, shiftR, (.|.))
 import Data.Foldable (foldl')
 import Data.Function.FastMemo.Class (Memoizable (..))
+import Data.Function.FastMemo.List ()
 import Data.Function.FastMemo.Word ()
 import Data.List.NonEmpty (NonEmpty (..))
 import Data.Word (Word8)
diff --git a/src/Data/Function/FastMemo/Vector.hs b/src/Data/Function/FastMemo/Vector.hs
--- a/src/Data/Function/FastMemo/Vector.hs
+++ b/src/Data/Function/FastMemo/Vector.hs
@@ -1,17 +1,17 @@
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE StandaloneDeriving #-}
 {-# OPTIONS_GHC -Wno-orphans #-}
 
 module Data.Function.FastMemo.Vector () where
 
 import Data.Function.FastMemo.Class (Memoizable (..))
+import Data.Function.FastMemo.List (AsList (..))
 import qualified Data.Vector as V
 import qualified Data.Vector.Storable as SV
 import qualified Data.Vector.Unboxed as UV
 
-instance Memoizable a => Memoizable (V.Vector a) where
-  memoize f = memoize (f . V.fromList) . V.toList
+deriving via AsList (V.Vector a) instance Memoizable a => Memoizable (V.Vector a)
 
-instance (SV.Storable a, Memoizable a) => Memoizable (SV.Vector a) where
-  memoize f = memoize (f . SV.fromList) . SV.toList
+deriving via AsList (SV.Vector a) instance (SV.Storable a, Memoizable a) => Memoizable (SV.Vector a)
 
-instance (UV.Unbox a, Memoizable a) => Memoizable (UV.Vector a) where
-  memoize f = memoize (f . UV.fromList) . UV.toList
+deriving via AsList (UV.Vector a) instance (UV.Unbox a, Memoizable a) => Memoizable (UV.Vector a)
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -7,8 +7,14 @@
 import Data.Function.FastMemo
 import Data.Functor (($>))
 import Data.Int (Int16, Int32, Int64, Int8)
+import Data.IntMap (IntMap)
+import Data.IntSet (IntSet)
+import Data.Map (Map)
 import Data.Proxy (Proxy (Proxy))
 import Data.Ratio (Ratio)
+import Data.Sequence (Seq)
+import Data.Set (Set)
+import qualified Data.Tree as Containers
 import Data.Word (Word16, Word32, Word64, Word8)
 import Examples (Color (Color), Tree (Leaf, Node), fibonacci)
 import Numeric.Natural (Natural)
@@ -60,7 +66,7 @@
 prop_bigIntegerMemoizesId :: Property
 prop_bigIntegerMemoizesId =
   forAllShrink
-    (genBigBound >>= \b -> choose (- b, b))
+    (genBigBound >>= \b -> choose (-b, b))
     shrink
     prop_memoizesId
 
@@ -137,6 +143,24 @@
 
 prop_ratioMemoizesId :: (Integral a, Memoizable a, Show a) => Ratio a -> Property
 prop_ratioMemoizesId = prop_memoizesId
+
+prop_intsetMemoizesId :: IntSet -> Property
+prop_intsetMemoizesId = prop_memoizesId
+
+prop_intmapMemoizesId :: (Eq a, Memoizable a, Show a) => IntMap a -> Property
+prop_intmapMemoizesId = prop_memoizesId
+
+prop_setMemoizesId :: (Ord a, Memoizable a, Show a) => Set a -> Property
+prop_setMemoizesId = prop_memoizesId
+
+prop_mapMemoizesId :: (Ord a, Memoizable a, Show a, Eq b, Memoizable b, Show b) => Map a b -> Property
+prop_mapMemoizesId = prop_memoizesId
+
+prop_seqMemoizesId :: (Eq a, Memoizable a, Show a) => Seq a -> Property
+prop_seqMemoizesId = prop_memoizesId
+
+prop_containerTreeMemoizesId :: (Eq a, Memoizable a, Show a) => Containers.Tree a -> Property
+prop_containerTreeMemoizesId = prop_memoizesId
 
 deriving instance Eq Color
 
