diff --git a/extensible-effects.cabal b/extensible-effects.cabal
--- a/extensible-effects.cabal
+++ b/extensible-effects.cabal
@@ -6,7 +6,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             2.5.1.2
+version:             2.5.2.0
 
 -- A short (one-line) description of the package.
 synopsis:            An Alternative to Monad Transformers
diff --git a/src/Control/Eff/Example.hs b/src/Control/Eff/Example.hs
--- a/src/Control/Eff/Example.hs
+++ b/src/Control/Eff/Example.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -Werror #-}
+{-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE TypeOperators, GADTs, DataKinds #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE Safe #-}
@@ -25,9 +25,9 @@
 -- }}}
 
 -- | Multiple Reader effects
-sum2 :: Member (Reader Int) r
-     => Member (Reader Float) r
-     => Eff r Float
+sum2 :: ([ Reader Int
+         , Reader Float
+         ] <:: r) => Eff r Float
 sum2 = do
   v1 <- ask
   v2 <- ask
@@ -46,7 +46,10 @@
 sumAll = mapM_ (modify . (+))
 
 -- | Write a list of numbers and add them to the current state.
-writeAndAdd :: (Member (Writer a) e, Member (State a) e, Num a)
+writeAndAdd :: ( [ Writer a
+                 , State a
+                 ] <:: e
+               , Num a)
             => [a]
             -> Eff e ()
 writeAndAdd l = do
diff --git a/src/Control/Eff/Internal.hs b/src/Control/Eff/Internal.hs
--- a/src/Control/Eff/Internal.hs
+++ b/src/Control/Eff/Internal.hs
@@ -1,4 +1,3 @@
-{-# OPTIONS_GHC -Werror #-}
 {-# LANGUAGE Trustworthy #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
diff --git a/src/Control/Eff/NdetEff.hs b/src/Control/Eff/NdetEff.hs
--- a/src/Control/Eff/NdetEff.hs
+++ b/src/Control/Eff/NdetEff.hs
@@ -1,5 +1,6 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
 {-# LANGUAGE TypeFamilies #-}
-{-# OPTIONS_GHC -Werror -fno-warn-orphans #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE GADTs #-}
diff --git a/src/Control/Eff/State/Lazy.hs b/src/Control/Eff/State/Lazy.hs
--- a/src/Control/Eff/State/Lazy.hs
+++ b/src/Control/Eff/State/Lazy.hs
@@ -1,4 +1,3 @@
-{-# OPTIONS_GHC -Werror #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE DataKinds #-}
diff --git a/src/Control/Eff/State/OnDemand.hs b/src/Control/Eff/State/OnDemand.hs
--- a/src/Control/Eff/State/OnDemand.hs
+++ b/src/Control/Eff/State/OnDemand.hs
@@ -1,4 +1,3 @@
-{-# OPTIONS_GHC -Werror #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE DataKinds #-}
diff --git a/src/Control/Eff/State/Strict.hs b/src/Control/Eff/State/Strict.hs
--- a/src/Control/Eff/State/Strict.hs
+++ b/src/Control/Eff/State/Strict.hs
@@ -1,4 +1,3 @@
-{-# OPTIONS_GHC -Werror #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE BangPatterns #-}
diff --git a/src/Control/Eff/Trace.hs b/src/Control/Eff/Trace.hs
--- a/src/Control/Eff/Trace.hs
+++ b/src/Control/Eff/Trace.hs
@@ -1,4 +1,3 @@
-{-# OPTIONS_GHC -Werror #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE DeriveFunctor #-}
 {-# LANGUAGE FlexibleContexts #-}
diff --git a/src/Data/OpenUnion.hs b/src/Data/OpenUnion.hs
--- a/src/Data/OpenUnion.hs
+++ b/src/Data/OpenUnion.hs
@@ -1,18 +1,22 @@
 {-# OPTIONS_HADDOCK show-extensions #-}
+{-# OPTIONS_GHC -Wwarn #-}
 
 {-# LANGUAGE CPP #-}
 
-{-# LANGUAGE TypeFamilies, TypeOperators #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
-{-# LANGUAGE DataKinds, PolyKinds #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FlexibleContexts #-}
 {-# LANGUAGE Trustworthy #-}
-{-# OPTIONS_GHC -Wwarn #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
 
 #if __GLASGOW_HASKELL__ < 710 || FORCE_OU51
 {-# LANGUAGE OverlappingInstances #-}
-#else
 #endif
 
 -- Only for SetMember below, when emulating Monad Transformers
@@ -51,13 +55,23 @@
 -- type t in the list r as the TRep. (We will need UnsafeCoerce then).
 --
 -- The interface is the same as of other OpenUnion*.hs
-module Data.OpenUnion (Union, inj, prj, decomp,
-                   Member, SetMember, weaken
-                  ) where
+module Data.OpenUnion ( Union
+                      , inj
+                      , prj
+                      , decomp
+                      , Member
+                      , SetMember
+                      , type(<::)
+                      , weaken
+                      ) where
 
 import Unsafe.Coerce(unsafeCoerce)
+
 #if __GLASGOW_HASKELL__ > 800
+import Data.Kind (Constraint)
 import GHC.TypeLits
+#else
+import GHC.Exts (Constraint)
 #endif
 
 -- | The data constructors of Union are not exported
@@ -124,6 +138,22 @@
   inj = inj' (unP $ (elemNo :: P t r))
   prj = prj' (unP $ (elemNo :: P t r))
 #endif
+
+-- | A useful operator for reducing boilerplate.
+--
+-- @
+-- f :: [Reader Int, Writer String] ::> r
+--   => a -> Eff r b
+-- @
+-- is equal to
+--
+-- @
+-- f :: (Member (Reader Int) r, Member (Writer String) r)
+--   => a -> Eff r b
+-- @
+type family (<::) (ms :: [* -> *]) r where
+  (<::) '[] r = (() :: Constraint)
+  (<::) (m ': ms) r = (Member m r, (<::) ms r)
 
 {-# INLINE [2] decomp #-}
 decomp :: Union (t ': r) v -> Either (Union r v) (t v)
diff --git a/test/Utils.hs b/test/Utils.hs
--- a/test/Utils.hs
+++ b/test/Utils.hs
@@ -1,5 +1,3 @@
-{-# OPTIONS_GHC -Werror #-}
-
 module Utils where
 
 import Control.Exception (ErrorCall, catch)
