diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,12 @@
+# Changelog
+
+`primitive-convenience` uses [PVP Versioning][1].
+The changelog is available [on GitHub][2].
+
+0.0.0
+=====
+
+* Initially created.
+
+[1]: https://pvp.haskell.org
+[2]: https://github.com/haskell-primitive/primitive-convenience/releases
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2019, chessai
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,10 @@
+# primitive-convenience
+
+[![Hackage](https://img.shields.io/hackage/v/primitive-convenience.svg)](https://hackage.haskell.org/package/primitive-convenience)
+[![BSD3 license](https://img.shields.io/badge/license-BSD3-blue.svg)](LICENSE)
+[![Build status](https://secure.travis-ci.org/haskell-primitive/primitive-convenience.svg)](https://travis-ci.org/haskell-primitive/primitive-convenience)
+
+convenience classes for PrimMonad/PrimBase. The 'PrimMonad' state token
+type can be annoying to handle in constraints. The typeclasses provided
+in this library let users (visually) notice 'PrimState' equality
+constraints less, by witnessing that `s ~ 'PrimState' m`.
diff --git a/primitive-convenience.cabal b/primitive-convenience.cabal
new file mode 100644
--- /dev/null
+++ b/primitive-convenience.cabal
@@ -0,0 +1,53 @@
+cabal-version: 2.2
+name:
+  primitive-convenience
+version:
+  0.1
+synopsis:
+  convenience class for PrimMonad m/PrimState m
+description:
+  This library provides convenience classes for PrimMonad/PrimBase.
+  .
+  The 'PrimMonad' state token type can be annoying to handle in
+  constraints. The typeclasses provided in this library let users
+  (visually) notice 'PrimState' equality constraints less, by
+  witnessing that `s ~ 'PrimState' m`.
+homepage:
+  https://github.com/haskell-primitive/primitive-convenience
+bug-reports:
+  https://github.com/haskell-primitive/primitive-convenience/issues
+license:
+  BSD-3-Clause
+license-file:
+  LICENSE
+author:
+  chessai
+maintainer:
+  chessai <chessai1996@gmail.com>
+copyright:
+  © 2019 chessai
+category:
+  Data
+build-type:
+  Simple
+extra-doc-files:
+    README.md
+  , CHANGELOG.md
+
+library
+  hs-source-dirs:
+    src
+  exposed-modules:
+    Control.Monad.Primitive.Convenience
+  build-depends:
+    , primitive >= 0.6.4 && < 0.8
+  ghc-options:
+    -Wall
+  default-language:
+    Haskell2010
+
+source-repository head
+  type:
+    git
+  location:
+    https://github.com/haskell-primitive/primitive-convenience.git
diff --git a/src/Control/Monad/Primitive/Convenience.hs b/src/Control/Monad/Primitive/Convenience.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Primitive/Convenience.hs
@@ -0,0 +1,31 @@
+{-# language
+    FlexibleInstances
+  , FunctionalDependencies
+  , MultiParamTypeClasses
+  , NoImplicitPrelude
+  , TypeFamilies
+  , UndecidableInstances
+  #-}
+
+{-| Convenience typeclass for working with polymorphic @'PrimMonad'@s.
+|-}
+module Control.Monad.Primitive.Convenience
+  ( MonadPrim
+  , MonadPrimBase
+  ) where
+
+import Control.Monad.Primitive
+
+-- | 'PrimMonad''s state token type can be annoying to handle
+--   in constraints. This typeclass lets users (visually) notice
+--   'PrimState' equality constraints less, by witnessing that
+--   @s ~ 'PrimState' m@.
+class (PrimMonad m, s ~ PrimState m) => MonadPrim s m | m -> s where
+instance (PrimMonad m, s ~ PrimState m) => MonadPrim s m
+
+-- | 'PrimBase''s state token type can be annoying to handle
+--   in constraints. This typeclass lets users (visually) notice
+--   'PrimState' equality constraints less, by witnessing that
+--   @s ~ 'PrimState' m@.
+class (PrimBase m, s ~ PrimState m) => MonadPrimBase s m | m -> s where
+instance (PrimBase m, s ~ PrimState m) => MonadPrimBase s m
