diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,43 @@
+# Changelog
+
+## [0.5.0.5] - 2024-09-19
+
+### Added
+
+* `Validity v => Validity (IntMap v)`
+
+## [0.5.0.4] - 2020-06-17
+
+### Added
+
+* `distinctOrd`
+
+## [0.5.0.3] - 2020-04-23
+
+### Changed
+
+* The same as 0.5.0.2, but now it actually works.
+
+## [0.5.0.2] - 2020-04-23
+
+### Changed
+
+* Exposed `decorateMap` from `Data.Validity.Containers`
+
+## [0.5.0.1] - 2019-09-23
+
+### Changed
+
+* Improved the cabal file
+* Used `++` instead of `<>` for a string, for compatibility purposes
+
+## [0.5.0.0] - 2019-09-23
+
+### Added
+
+* `decorateMap`
+
+### Changed
+
+* The validity instance for maps now requires that keys are `Show`able.
+
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2016 Tom Sydney Kerckhove
+Copyright (c) 2016-2021 Tom Sydney Kerckhove
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-import Distribution.Simple
-
-main = defaultMain
diff --git a/src/Data/Validity/Containers.hs b/src/Data/Validity/Containers.hs
--- a/src/Data/Validity/Containers.hs
+++ b/src/Data/Validity/Containers.hs
@@ -1,6 +1,17 @@
-module Data.Validity.Containers where
+{-# OPTIONS_GHC -fno-warn-dodgy-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
 
-import Data.Validity.Map as Containers ()
-import Data.Validity.Sequence as Containers ()
-import Data.Validity.Set as Containers ()
-import Data.Validity.Tree as Containers ()
+module Data.Validity.Containers
+  ( module Data.Validity.Map,
+    module Data.Validity.IntMap,
+    module Data.Validity.Sequence,
+    module Data.Validity.Set,
+    module Data.Validity.Tree,
+  )
+where
+
+import Data.Validity.IntMap
+import Data.Validity.Map
+import Data.Validity.Sequence
+import Data.Validity.Set
+import Data.Validity.Tree
diff --git a/src/Data/Validity/IntMap.hs b/src/Data/Validity/IntMap.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Validity/IntMap.hs
@@ -0,0 +1,22 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Data.Validity.IntMap
+  ( decorateIntMap,
+  )
+where
+
+import Data.IntMap (IntMap)
+import qualified Data.IntMap as IM
+import Data.Validity
+
+-- | A 'IntMap' of things is valid if all the keys and values are valid and the 'IntMap' itself
+-- is valid.
+instance (Validity v) => Validity (IntMap v) where
+  validate m =
+    decorate "IntMap elements" $
+      decorateIntMap m validate
+
+decorateIntMap :: IntMap v -> (v -> Validation) -> Validation
+decorateIntMap m func = IM.foldMapWithKey go m
+  where
+    go k v = decorate ("The key/value at key " ++ show k) $ func v
diff --git a/src/Data/Validity/Map.hs b/src/Data/Validity/Map.hs
--- a/src/Data/Validity/Map.hs
+++ b/src/Data/Validity/Map.hs
@@ -1,14 +1,26 @@
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
-module Data.Validity.Map where
-
-import Data.Validity
+module Data.Validity.Map
+  ( decorateMap,
+  )
+where
 
 import Data.Map (Map)
 import qualified Data.Map as M
+import Data.Validity
 
 -- | A 'Map' of things is valid if all the keys and values are valid and the 'Map' itself
 -- is valid.
-instance (Ord k, Validity k, Validity v) =>
-         Validity (Map k v) where
-    isValid m = M.valid m && all isValid (M.toList m)
+instance (Show k, Ord k, Validity k, Validity v) => Validity (Map k v) where
+  validate m =
+    mconcat
+      [ declare "The Map structure is valid." $ M.valid m,
+        decorate "Map elements" $
+          decorateMap m $
+            \k v -> mconcat [delve "The key" k, delve "The value" v]
+      ]
+
+decorateMap :: (Show k) => Map k v -> (k -> v -> Validation) -> Validation
+decorateMap m func = M.foldMapWithKey go m
+  where
+    go k v = decorate ("The key/value at key " ++ show k) $ func k v
diff --git a/src/Data/Validity/Sequence.hs b/src/Data/Validity/Sequence.hs
--- a/src/Data/Validity/Sequence.hs
+++ b/src/Data/Validity/Sequence.hs
@@ -2,12 +2,10 @@
 
 module Data.Validity.Sequence where
 
-import Data.Validity
-
 import Data.Foldable (toList)
 import Data.Sequence (Seq)
+import Data.Validity
 
 -- | A 'Seq'uence of things is valid if all the elements are valid.
-instance Validity v =>
-         Validity (Seq v) where
-    isValid = all isValid . toList
+instance (Validity v) => Validity (Seq v) where
+  validate s = annotate (toList s) "Seq elements"
diff --git a/src/Data/Validity/Set.hs b/src/Data/Validity/Set.hs
--- a/src/Data/Validity/Set.hs
+++ b/src/Data/Validity/Set.hs
@@ -2,13 +2,19 @@
 
 module Data.Validity.Set where
 
-import Data.Validity
-
+import Data.Containers.ListUtils
 import Data.Set (Set)
 import qualified Data.Set as S
+import Data.Validity
 
 -- | A 'Set' of things is valid if all the elements are valid and the 'Set' itself
 -- is valid.
-instance (Ord v, Validity v) =>
-         Validity (Set v) where
-    isValid s = S.valid s && all isValid (S.toList s)
+instance (Ord v, Validity v) => Validity (Set v) where
+  validate s =
+    mconcat
+      [ declare "The set structure is valid." $ S.valid s,
+        annotate (S.toList s) "Set elements"
+      ]
+
+distinctOrd :: (Ord a) => [a] -> Bool
+distinctOrd ls = nubOrd ls == ls
diff --git a/src/Data/Validity/Tree.hs b/src/Data/Validity/Tree.hs
--- a/src/Data/Validity/Tree.hs
+++ b/src/Data/Validity/Tree.hs
@@ -2,11 +2,10 @@
 
 module Data.Validity.Tree where
 
-import Data.Validity
-
 import Data.Tree
+import Data.Validity
 
 -- | A 'Tree' of things is valid if all the things in the 'Tree' are valid.
-instance Validity a =>
-         Validity (Tree a) where
-    isValid (Node rl sf) = isValid rl && isValid sf
+instance (Validity a) => Validity (Tree a) where
+  validate (Node rl sf) =
+    mconcat [annotate rl "rootLabel", annotate sf "subForest"]
diff --git a/validity-containers.cabal b/validity-containers.cabal
--- a/validity-containers.cabal
+++ b/validity-containers.cabal
@@ -1,33 +1,42 @@
-name: validity-containers
-version: 0.1.0.3
-cabal-version: >=1.10
-build-type: Simple
-license: MIT
-license-file: LICENSE
-copyright: Copyright: (c) 2016 Tom Sydney Kerckhove
-maintainer: syd.kerckhove@gmail.com
-homepage: https://github.com/NorfairKing/validity#readme
-synopsis: Validity instances for containers
-description:
-    Please see README.md
-category: Validity
-author: Tom Sydney Kerckhove
+cabal-version: 1.12
 
+-- This file has been generated from package.yaml by hpack version 0.36.0.
+--
+-- see: https://github.com/sol/hpack
+
+name:           validity-containers
+version:        0.5.0.5
+synopsis:       Validity instances for containers
+category:       Validity
+homepage:       https://github.com/NorfairKing/validity#readme
+bug-reports:    https://github.com/NorfairKing/validity/issues
+author:         Tom Sydney Kerckhove
+maintainer:     syd@cs-syd.eu
+copyright:      Copyright: (c) 2016-2021 Tom Sydney Kerckhove
+license:        MIT
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    CHANGELOG.md
+
 source-repository head
-    type: git
-    location: https://github.com/NorfairKing/validity
+  type: git
+  location: https://github.com/NorfairKing/validity
 
 library
-    exposed-modules:
-        Data.Validity.Containers
-        Data.Validity.Tree
-        Data.Validity.Map
-        Data.Validity.Sequence
-        Data.Validity.Set
-    build-depends:
-        base >= 4.7 && <5,
-        validity >=0.3 && <0.4,
-        containers -any
-    default-language: Haskell2010
-    hs-source-dirs: src
-
+  exposed-modules:
+      Data.Validity.Containers
+      Data.Validity.IntMap
+      Data.Validity.Map
+      Data.Validity.Sequence
+      Data.Validity.Set
+      Data.Validity.Tree
+  other-modules:
+      Paths_validity_containers
+  hs-source-dirs:
+      src
+  build-depends:
+      base >=4.7 && <5
+    , containers >=0.6.0.1
+    , validity >=0.5
+  default-language: Haskell2010
