diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,9 @@
+0.2.2
+=====
+
+* [#33](https://github.com/serokell/universum/issues/33):
+  Add `($)` and `Each` type operators.
+
 0.2.1
 =====
 
diff --git a/src/Containers.hs b/src/Containers.hs
--- a/src/Containers.hs
+++ b/src/Containers.hs
@@ -13,7 +13,7 @@
 
 module Containers
        (
-       -- * Foldable-like classes and methods
+         -- * Foldable-like classes and methods
          Element
        , Container(..)
        , NontrivialContainer(..)
@@ -29,7 +29,7 @@
        , sequence_
        , asum
 
-       -- * Others
+         -- * Others
        , One(..)
        ) where
 
@@ -38,6 +38,7 @@
 import           Data.Coerce            (Coercible, coerce)
 import           Data.Foldable          (Foldable)
 import qualified Data.Foldable          as F
+import           Data.Hashable          (Hashable)
 import           Data.Maybe             (fromMaybe)
 import           Data.Monoid            (All(..), Any(..), First(..))
 import           Data.Word              (Word8)
@@ -53,6 +54,8 @@
 import qualified Data.List.NonEmpty     as NE
 #endif
 
+import qualified Data.Sequence          as SEQ
+
 import qualified Data.ByteString        as BS
 import qualified Data.ByteString.Lazy   as BSL
 
@@ -71,7 +74,7 @@
 import qualified Data.Vector.Primitive  as VP
 import qualified Data.Vector.Storable   as VS
 
-import Data.Hashable (Hashable)
+import           Applicative            (pass)
 
 ----------------------------------------------------------------------------
 -- Containers (e.g. tuples aren't containers)
@@ -275,7 +278,7 @@
   length = fromIntegral . TL.length
   {-# INLINE length #-}
   -- will be okay thanks to rewrite rules
-  elem c s = TL.isInfixOf (TL.singleton c) s 
+  elem c s = TL.isInfixOf (TL.singleton c) s
   {-# INLINE elem #-}
   maximum = TL.maximum
   {-# INLINE maximum #-}
@@ -377,7 +380,7 @@
 traverse_
     :: (NontrivialContainer t, Applicative f)
     => (Element t -> f b) -> t -> f ()
-traverse_ f = foldr ((*>) . f) (pure ())
+traverse_ f = foldr ((*>) . f) pass
 
 for_
     :: (NontrivialContainer t, Applicative f)
@@ -388,7 +391,7 @@
 mapM_
     :: (NontrivialContainer t, Monad m)
     => (Element t -> m b) -> t -> m ()
-mapM_ f= foldr ((>>) . f) (return ())
+mapM_ f= foldr ((>>) . f) pass
 
 forM_
     :: (NontrivialContainer t, Monad m)
@@ -399,12 +402,12 @@
 sequenceA_
     :: (NontrivialContainer t, Applicative f, Element t ~ f a)
     => t -> f ()
-sequenceA_ = foldr (*>) (pure ())
+sequenceA_ = foldr (*>) pass
 
 sequence_
     :: (NontrivialContainer t, Monad m, Element t ~ m a)
     => t -> m ()
-sequence_ = foldr (>>) (return ())
+sequence_ = foldr (>>) pass
 
 asum
     :: (NontrivialContainer t, Alternative f, Element t ~ f a)
@@ -485,6 +488,11 @@
     one = (NE.:|[])
     {-# INLINE one #-}
 #endif
+
+instance One (SEQ.Seq a) where
+    type OneItem (SEQ.Seq a) = a
+    one = (SEQ.empty SEQ.|>)
+    {-# INLINE one #-}
 
 -- Monomorphic sequences
 
diff --git a/src/Debug.hs b/src/Debug.hs
--- a/src/Debug.hs
+++ b/src/Debug.hs
@@ -18,19 +18,18 @@
        ) where
 
 import           Control.Monad          (Monad, return)
-import           Data.Text              (Text, unpack)
-
+import           Control.Monad.IO.Class (MonadIO)
 import           Data.Data              (Data)
+import           Data.Text              (Text, unpack)
 import           Data.Typeable          (Typeable)
 import           GHC.Generics           (Generic)
-
-import           Control.Monad.IO.Class (MonadIO)
+import           System.IO.Unsafe       (unsafePerformIO)
 
 import qualified Base                   as P
 import qualified Prelude                as P
 import           Show                   (Print, putStrLn)
 
-import           System.IO.Unsafe       (unsafePerformIO)
+import           Applicative            (pass)
 
 {-# WARNING trace "'trace' remains in code" #-}
 trace :: Print b => b -> a -> a
@@ -58,13 +57,13 @@
 
 {-# WARNING traceShowM "'traceShowM' remains in code" #-}
 traceShowM :: (P.Show a, Monad m) => a -> m ()
-traceShowM a = trace (P.show a) (return ())
+traceShowM a = trace (P.show a) pass
 
 {-# WARNING traceM "'traceM' remains in code" #-}
 traceM :: (Monad m) => Text -> m ()
-traceM s = trace (unpack s) (return ())
+traceM s = trace (unpack s) pass
 
-{-# WARNING traceId "'traceM' remains in code" #-}
+{-# WARNING traceId "'traceId' remains in code" #-}
 traceId :: Text -> Text
 traceId s = trace s s
 
diff --git a/src/List.hs b/src/List.hs
--- a/src/List.hs
+++ b/src/List.hs
@@ -15,8 +15,6 @@
        , zip3
        ) where
 
-import           Control.Applicative (Applicative)
-import           Control.Monad       (Monad (..))
 import           Data.Function       ((.))
 import           Data.Functor        (fmap)
 import           Data.List           (sortBy, unzip, unzip3, zip, zip3)
@@ -24,10 +22,13 @@
 import qualified Data.Set            as Set
 
 #if ( __GLASGOW_HASKELL__ >= 800 )
+import           Control.Applicative (Applicative)
+import           Control.Monad       (Monad (..))
 import           Data.List.NonEmpty  as X (NonEmpty (..))
-#endif
 
 import           Applicative         (pass)
+#endif
+
 
 sortOn :: (Ord o) => (a -> o) -> [a] -> [a]
 sortOn = sortBy . comparing
diff --git a/src/Monad.hs b/src/Monad.hs
--- a/src/Monad.hs
+++ b/src/Monad.hs
@@ -65,10 +65,10 @@
 #if __GLASGOW_HASKELL__ >= 800
 import           Control.Monad.Fail              (MonadFail (..))
 #else
-import           Prelude                         (String)
+import           Prelude                         (Maybe (Nothing), String)
 import qualified Prelude                         as P (fail)
-import           Text.ParserCombinators.ReadP
-import           Text.ParserCombinators.ReadPrec
+import           Text.ParserCombinators.ReadP    (ReadP)
+import           Text.ParserCombinators.ReadPrec (ReadPrec)
 #endif
 
 concatMapM :: Monad m => (a -> m [b]) -> [a] -> m [b]
diff --git a/src/TypeOps.hs b/src/TypeOps.hs
new file mode 100644
--- /dev/null
+++ b/src/TypeOps.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE CPP                #-}
+{-# LANGUAGE ConstraintKinds    #-}
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE ExplicitNamespaces #-}
+{-# LANGUAGE KindSignatures     #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE PolyKinds          #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+module TypeOps
+       ( type Each
+       , type ($)
+       ) where
+
+#if __GLASGOW_HASKELL__ <= 710
+import           GHC.Prim              (Constraint)
+#else
+import           Data.Kind             (Constraint)
+#endif
+
+import           Control.Type.Operator (type ($), type (<+>))
+
+-- | Map several constraints over several variables.
+--
+-- @
+-- f :: Each [Show, Read] [a, b] => a -> b -> String
+-- =
+-- f :: (Show a, Show b, Read a, Show b) => a -> b -> String
+-- @
+--
+-- To specify list with single constraint / variable, don't forget to prefix
+-- it with @\'@:
+--
+-- @
+-- f :: Each '[Show] [a, b] => a -> b -> String
+-- @
+type family Each (c :: [k -> Constraint]) (as :: [k]) where
+    Each c '[] = (() :: Constraint)
+    Each c (h ': t) = (c <+> h, Each c t)
diff --git a/src/Universum.hs b/src/Universum.hs
--- a/src/Universum.hs
+++ b/src/Universum.hs
@@ -45,6 +45,7 @@
 import           Monad                    as X
 import           Panic                    as X
 import           Show                     as X
+import           TypeOps                  as X
 
 import           Base                     as Base hiding (error, print, putStr, putStrLn,
                                                    show, showFloat, showList, showSigned,
diff --git a/universum.cabal b/universum.cabal
--- a/universum.cabal
+++ b/universum.cabal
@@ -1,5 +1,5 @@
 name:                universum
-version:             0.2.1
+version:             0.2.2
 synopsis:            Custom prelude used in Serokell
 description:         Custom prelude used in Serokell
 homepage:            https://github.com/serokell/universum
@@ -7,18 +7,16 @@
 license-file:        LICENSE
 author:              Stephen Diehl
 maintainer:          hi@serokell.io
-copyright:           2016-2016 Stephen Diehl, 2016-2016 Serokell
+copyright:           2016-2016 Stephen Diehl, 2016-2017 Serokell
 category:            Prelude
 build-type:          Simple
-extra-source-files:
-  CHANGES.md
+extra-source-files:  CHANGES.md
 cabal-version:       >=1.10
+Bug-Reports:         https://github.com/serokell/universum/issues
 tested-with:
-  GHC == 7.10.1,
-  GHC == 7.10.2,
   GHC == 7.10.3,
-  GHC == 8.0.1
-Bug-Reports:         https://github.com/serokell/universum/issues
+  GHC == 8.0.1,
+  GHC == 8.0.2
 
 Source-Repository head
     type: git
@@ -41,6 +39,7 @@
     List
     Panic
     Show
+    TypeOps
     Unsafe
 
     Monad
@@ -71,10 +70,11 @@
     safe                  >= 0.3    && <0.4,
     stm                   >= 2.4    && <2.5,
     text                  >= 1.2    && <1.3,
-    utf8-string           >= 1.0    && <1.1,
     text-format,
     transformers          >= 0.4    && <0.6,
+    type-operators        == 0.1.0.4,
     unordered-containers,
+    utf8-string           >= 1.0    && <1.1,
     vector
 
   hs-source-dirs:      src
