diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright Donnacha Oisín Kidney (c) 2017
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/mono-traversable-wrapper.cabal b/mono-traversable-wrapper.cabal
new file mode 100644
--- /dev/null
+++ b/mono-traversable-wrapper.cabal
@@ -0,0 +1,25 @@
+name:                mono-traversable-wrapper
+version:             0.1.0.0
+synopsis:            Wrapper providing Foldable instance for MonoFoldables.
+description:         Please see README.md
+homepage:            https://github.com/oisdk/mono-traversable-compat
+license:             MIT
+license-file:        LICENSE
+author:              Donnacha Oisín Kidney
+maintainer:          mail@doisinkidney.com
+copyright:           2016 Donnacha Oisín Kidney
+category:            Data
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  exposed-modules:     Data.MonoTraversable.Container
+  build-depends:       base >= 4.7 && < 5
+                     , mono-traversable >= 0.5
+  default-language:    Haskell2010
+  ghc-options:         -Wall
+
+source-repository head
+  type:     git
+  location: https://github.com/oisdk/mono-traversable-compat
diff --git a/src/Data/MonoTraversable/Container.hs b/src/Data/MonoTraversable/Container.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/MonoTraversable/Container.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE GADTs #-}
+
+-- | This module provides the 'Container' type, which wraps monomorphic types,
+-- and makes them conform to the "Prelude"'s non-monomorphic typeclasses.
+module Data.MonoTraversable.Container where
+
+import           Data.Foldable
+import           Data.MonoTraversable
+
+import           Text.Read
+
+-- | This type can wrap a monomorphic  type to allow it to conform to
+-- 'Foldable'. For instance, the wrapper for 'Data.Text.Text' would be
+-- defined as:
+--
+-- @type FoldableText = 'Container' 'Text' 'Char'@
+--
+-- Now, this type conforms to 'Foldable'.
+data Container xs a b where
+        -- | Can only construct when last type variable is equal to second.
+        Container :: (a ~ b) => xs -> Container xs a b
+
+-- | Selector for 'Container'
+getContainer :: Container xs a b -> xs
+getContainer (Container xs) = xs
+{-# INLINE getContainer #-}
+
+instance Eq xs => Eq (Container xs a b) where
+  Container x == Container y = x == y
+  {-# INLINE (==) #-}
+
+instance Ord xs => Ord (Container xs a b) where
+  compare (Container x) (Container y) = compare x y
+  {-# INLINE compare #-}
+  Container x < Container y = x < y
+  {-# INLINE (<) #-}
+  Container x >= Container y = x >= y
+  {-# INLINE (>=) #-}
+  Container x > Container y = x > y
+  {-# INLINE (>) #-}
+  Container x <= Container y = x <= y
+  {-# INLINE (<=) #-}
+  max (Container x) (Container y) = Container (max x y)
+  {-# INLINE max #-}
+  min (Container x) (Container y) = Container (min x y)
+  {-# INLINE min #-}
+
+instance Show xs => Show (Container xs a b) where
+  showsPrec d (Container a) =
+    showParen (d >= 11)
+      $ showString "Container "
+      . showsPrec 11 a
+
+instance (Read xs, a ~ b) => Read (Container xs a b) where
+  readPrec = parens $ prec 10 $ do
+    Ident "Container" <- lexP
+    Container <$> step (readS_to_Prec readsPrec)
+
+instance (MonoFoldable xs, element ~ Element xs) =>
+         Foldable (Container xs element) where
+    foldr f b (Container xs) = ofoldr f b xs
+    {-# INLINE foldr #-}
+    foldMap f (Container xs) = ofoldMap f xs
+    {-# INLINE foldMap #-}
+    foldl' f b (Container xs) = ofoldl' f b xs
+    {-# INLINE foldl' #-}
+    toList (Container xs) = otoList xs
+    {-# INLINE toList #-}
+    null (Container xs) = onull xs
+    {-# INLINE null #-}
+    length (Container xs) = olength xs
+    {-# INLINE length #-}
+    foldr1 f (Container xs) = ofoldr1Ex f xs
+    {-# INLINE foldr1 #-}
+    elem x (Container xs) = oelem x xs
+    {-# INLINE elem #-}
+    maximum (Container xs) = maximumEx xs
+    {-# INLINE maximum #-}
+    minimum (Container xs) = minimumEx xs
+    {-# INLINE minimum #-}
+    sum (Container xs) = osum xs
+    {-# INLINE sum #-}
+    product (Container xs) = oproduct xs
+    {-# INLINE product #-}
