diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 1.0.1.3
+
+* Make 'olength' for Set and Map O(1) [#125](https://github.com/snoyberg/mono-traversable/pull/125)
+
 ## 1.0.1.2
 
 * Support for GHC 8.2
diff --git a/mono-traversable.cabal b/mono-traversable.cabal
--- a/mono-traversable.cabal
+++ b/mono-traversable.cabal
@@ -1,5 +1,5 @@
 name:                mono-traversable
-version:             1.0.1.2
+version:             1.0.1.3
 synopsis:            Type classes for mapping, folding, and traversing monomorphic containers
 description:         Monomorphic variants of the Functor, Foldable, and Traversable typeclasses. If you understand Haskell's basic typeclasses, you understand mono-traversable. In addition to what you are used to, it adds on an IsSequence typeclass and has code for marking data structures as non-empty.
 homepage:            https://github.com/snoyberg/mono-traversable
diff --git a/src/Data/MonoTraversable.hs b/src/Data/MonoTraversable.hs
--- a/src/Data/MonoTraversable.hs
+++ b/src/Data/MonoTraversable.hs
@@ -62,6 +62,7 @@
 import Data.List.NonEmpty (NonEmpty)
 import Data.Functor.Identity (Identity)
 import Data.Map (Map)
+import qualified Data.Map.Strict as Map
 import Data.HashMap.Strict (HashMap)
 import Data.Vector (Vector)
 import Control.Monad.Trans.Maybe (MaybeT (..))
@@ -598,7 +599,9 @@
 instance MonoFoldable (Option a)
 instance MonoFoldable (NonEmpty a)
 instance MonoFoldable (Identity a)
-instance MonoFoldable (Map k v)
+instance MonoFoldable (Map k v) where
+    olength = Map.size
+    {-# INLINE olength #-}
 instance MonoFoldable (HashMap k v)
 instance MonoFoldable (Vector a) where
     ofoldr = V.foldr
@@ -630,7 +633,9 @@
     {-# INLINE unsafeHead #-}
     {-# INLINE maximumByEx #-}
     {-# INLINE minimumByEx #-}
-instance MonoFoldable (Set e)
+instance MonoFoldable (Set e) where
+    olength = Set.size
+    {-# INLINE olength #-}
 instance MonoFoldable (HashSet e)
 
 instance U.Unbox a => MonoFoldable (U.Vector a) where
