diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+# 1.0.1
+
+- Add 'withSomeM' combinator.
+  Allows to workaround: https://gitlab.haskell.org/ghc/ghc/issues/15681
+
 # 1.0.0.3
 
 - One less `unsafeCoerce` (thanks to David Feuer)
diff --git a/some.cabal b/some.cabal
--- a/some.cabal
+++ b/some.cabal
@@ -1,5 +1,5 @@
 name:               some
-version:            1.0.0.3
+version:            1.0.1
 stability:          provisional
 cabal-version:      >=1.10
 build-type:         Simple
diff --git a/src/Data/GADT/Internal.hs b/src/Data/GADT/Internal.hs
--- a/src/Data/GADT/Internal.hs
+++ b/src/Data/GADT/Internal.hs
@@ -121,16 +121,16 @@
         f (Refl, rest) = return (mkSome Refl, rest)
 
 instance (GRead a, GRead b) => GRead (Sum a b) where
-    greadsPrec d s = concat
-        [ readParen (d > 10)
+    greadsPrec d s =
+        readParen (d > 10)
             (\s1 -> [ (S $ \k -> withSome r (k . InL), t)
                     | ("InL", s2) <- lex s1
                     , (r, t) <- greadsPrec 11 s2 ]) s
-        , readParen (d > 10)
+        ++
+        readParen (d > 10)
             (\s1 -> [ (S $ \k -> withSome r (k . InR), t)
                     | ("InR", s2) <- lex s1
                     , (r, t) <- greadsPrec 11 s2 ]) s
-        ]
 
 -------------------------------------------------------------------------------
 -- GEq
@@ -363,6 +363,12 @@
 -- | Traverse over argument.
 traverseSome :: Functor m => (forall a. f a -> m (g a)) -> Some f -> m (Some g)
 traverseSome f x = withSome x $ \x' -> fmap mkSome (f x')
+
+-- | Monadic 'withSome'.
+--
+-- @since 1.0.1
+withSomeM :: Monad m => m (Some tag) -> (forall a. tag a -> m r) -> m r
+withSomeM m k = m >>= \s -> withSome s k
 
 -------------------------------------------------------------------------------
 -- Church Some instances
diff --git a/src/Data/Some.hs b/src/Data/Some.hs
--- a/src/Data/Some.hs
+++ b/src/Data/Some.hs
@@ -10,6 +10,7 @@
 #endif
 mkSome,
 withSome,
+withSomeM,
 mapSome,
 foldSome,
 traverseSome,
diff --git a/src/Data/Some/Church.hs b/src/Data/Some/Church.hs
--- a/src/Data/Some/Church.hs
+++ b/src/Data/Some/Church.hs
@@ -1,13 +1,14 @@
 {-# LANGUAGE CPP         #-}
 #if __GLASGOW_HASKELL__ >= 704
-{-# LANGUAGE Safe         #-}
+{-# LANGUAGE Safe        #-}
 #elif __GLASGOW_HASKELL__ >= 702
-{-# LANGUAGE Trustworthy  #-}
+{-# LANGUAGE Trustworthy #-}
 #endif
 module Data.Some.Church (
     Some(..),
     mkSome,
     mapSome,
+    withSomeM,
     foldSome,
     traverseSome,
     ) where
diff --git a/src/Data/Some/GADT.hs b/src/Data/Some/GADT.hs
--- a/src/Data/Some/GADT.hs
+++ b/src/Data/Some/GADT.hs
@@ -13,6 +13,7 @@
     Some(Some),
     mkSome,
     withSome,
+    withSomeM,
     mapSome,
     foldSome,
     traverseSome,
@@ -82,6 +83,12 @@
 -- | Eliminator.
 withSome :: Some tag -> (forall a. tag a -> b) -> b
 withSome (Some thing) some = some thing
+
+-- | Monadic 'withSome'.
+--
+-- @since 1.0.1
+withSomeM :: Monad m => m (Some tag) -> (forall a. tag a -> m r) -> m r
+withSomeM m k = m >>= \s -> withSome s k
 
 -- | @'flip' 'withSome'@
 foldSome :: (forall a. tag a -> b) -> Some tag -> b
diff --git a/src/Data/Some/Newtype.hs b/src/Data/Some/Newtype.hs
--- a/src/Data/Some/Newtype.hs
+++ b/src/Data/Some/Newtype.hs
@@ -3,7 +3,6 @@
 {-# LANGUAGE RankNTypes      #-}
 #if __GLASGOW_HASKELL__ >= 801
 {-# LANGUAGE PatternSynonyms #-}
-{-# LANGUAGE ViewPatterns    #-}
 #endif
 #if __GLASGOW_HASKELL__ >= 706
 {-# LANGUAGE PolyKinds       #-}
@@ -19,6 +18,7 @@
 #endif
     mkSome,
     withSome,
+    withSomeM,
     mapSome,
     foldSome,
     traverseSome,
@@ -103,6 +103,12 @@
 -- | Eliminator.
 withSome :: Some tag -> (forall a. tag a -> b) -> b
 withSome (UnsafeSome thing) some = some (unsafeCoerce thing)
+
+-- | Monadic 'withSome'.
+--
+-- @since 1.0.1
+withSomeM :: Monad m => m (Some tag) -> (forall a. tag a -> m r) -> m r
+withSomeM m k = m >>= \s -> withSome s k
 
 -- | @'flip' 'withSome'@
 foldSome :: (forall a. tag a -> b) -> Some tag -> b
