diff --git a/Data/Word8.hs b/Data/Word8.hs
new file mode 100644
--- /dev/null
+++ b/Data/Word8.hs
@@ -0,0 +1,291 @@
+-- | Word8 library to be used with Data.ByteString
+
+module Data.Word8 (
+  -- * Re-exporting
+    Word8
+  -- * Character classification
+  , isControl, isSpace, isLower, isUpper
+  , isAlpha, isAlphaNum, isPrint, isDigit, isOctDigit, isHexDigit
+  , isLetter, isMark, isNumber, isPunctuation, isSymbol, isSeparator
+  -- * Subranges
+  , isAscii, isLatin1, isAsciiUpper, isAsciiLower
+  -- * Case conversion
+  , toUpper, toLower, toTitle
+  -- * ASCII charactors
+  , _nul, _tab, _lf, _vt, _np, _cr
+  , _space, _exclam, _quotedbl, _numbersign, _dollar, _percent, _ampersand, _quotesingle, _parenleft, _parenright, _asterisk, _plus, _comma, _hyphen, _period, _slash
+  , _0, _1, _2, _3, _4, _5, _6, _7, _8, _9
+  , _colon, _semicolon, _less, _equal, _greater, _question, _at
+  , _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z
+  , _braketleft, _backslash, _bracketright, _circum, _underscore, _grave
+  , _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z
+  , _blaceleft, _bar, _braceright, _tilde, _del
+  -- * Some Latin-1 charactors
+  , _nbsp
+  , _ordfeminine, _softhyphen, _mu, _ordmasculine
+  , _s2, _s3, _s1, _1'4, _1'2, _3'4
+  , _Agrave, _Odieresis, _Oslash, _Thorn
+  , _germandbls, _agrave, _odieresis, _oslash, _thorn, _ydieresis
+  ) where
+
+import Data.Word (Word8)
+
+----------------------------------------------------------------
+
+isControl :: Word8 -> Bool
+isControl w = _nul <= w && w <= 0x1f
+           || _del <= w && w <= 0x9f
+
+isSpace :: Word8 -> Bool
+isSpace w = w == _space
+         || w == _tab
+         || w == _lf
+         || w == _cr
+         || w == _np
+         || w == _vt
+         || w == _nbsp
+
+isLower :: Word8 -> Bool
+isLower w = isLower' w
+         || w == _ordfeminine
+         || w == _mu
+         || w == _ordmasculine
+
+isLower' :: Word8 -> Bool
+isLower' w = isAsciiLower w
+          || _germandbls <= w && w <= _odieresis
+          || _oslash     <= w && w <= _ydieresis
+
+isUpper :: Word8 -> Bool
+isUpper w = isAsciiUpper w
+         || _Agrave <= w && w <= _Odieresis
+         || _Oslash <= w && w <= _Thorn
+
+isAlpha :: Word8 -> Bool
+isAlpha w = isLower w || isUpper w
+
+isAlphaNum :: Word8 -> Bool
+isAlphaNum w = isAlpha w || isNumber w
+
+isPrint :: Word8 -> Bool
+isPrint w
+  | w == _softhyphen = False
+isPrint w = _space <= w && w <= _tilde
+         || _nbsp  <= w && w <= _ydieresis
+
+isDigit :: Word8 -> Bool
+isDigit w = _0 <= w && w <= _9
+
+isOctDigit :: Word8 -> Bool
+isOctDigit w = _0 <= w && w <= _7
+
+isHexDigit :: Word8 -> Bool
+isHexDigit w = isDigit w
+            || _A <= w && w <= _F
+            || _a <= w && w <= _f
+
+isLetter :: Word8 -> Bool
+isLetter w = isLower w || isUpper w
+
+isMark :: Word8 -> Bool
+isMark _ = False
+
+isNumber :: Word8 -> Bool
+isNumber w = isDigit w
+          || w == _s1
+          || w == _s2
+          || w == _s3
+          || w == _1'4
+          || w == _1'2
+          || w == _3'4
+
+isPunctuation :: Word8 -> Bool
+isPunctuation w = w `elem` [0x21,0x22,0x23,0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x2d,0x2e,0x2f,0x3a,0x3b,0x3f,0x40,0x5b,0x5c,0x5d,0x5f,0x7b,0x7d,0xa1,0xab,0xb7,0xbb,0xbf]
+
+isSymbol :: Word8 -> Bool
+isSymbol w = w `elem` [0x24,0x2b,0x3c,0x3d,0x3e,0x5e,0x60,0x7c,0x7e,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xac,0xae,0xaf,0xb0,0xb1,0xb4,0xb6,0xb8,0xd7,0xf7]
+
+isSeparator :: Word8 -> Bool
+isSeparator w = w == _space
+             || w == _nbsp
+
+----------------------------------------------------------------
+
+isAscii :: Word8 -> Bool
+isAscii w = _nul <= w && w <= _del
+
+isLatin1 :: Word8 -> Bool
+isLatin1 _ = True
+
+isAsciiUpper :: Word8 -> Bool
+isAsciiUpper w = _A <= w && w <= _Z
+
+isAsciiLower :: Word8 -> Bool
+isAsciiLower w = _a <= w && w <= _z
+
+----------------------------------------------------------------
+
+toUpper :: Word8 -> Word8
+toUpper w
+  | w == _germandbls = w
+  | isLower' w       = w - _space
+  | otherwise        = w
+
+toLower :: Word8 -> Word8
+toLower w
+  | isUpper w = w + _space
+  | otherwise = w
+
+toTitle :: Word8 -> Word8
+toTitle = toUpper
+
+----------------------------------------------------------------
+
+_nul, _tab, _lf, _vt, _np, _cr :: Word8
+_nul = 0x00
+_tab = 0x09
+_lf  = 0x0a
+_vt  = 0x0b
+_np  = 0x0c
+_cr  = 0x0d
+
+_space, _exclam, _quotedbl, _numbersign, _dollar, _percent, _ampersand, _quotesingle, _parenleft, _parenright, _asterisk, _plus, _comma, _hyphen, _period, _slash :: Word8
+_space       = 0x20
+_exclam      = 0x21
+_quotedbl    = 0x22
+_numbersign  = 0x23
+_dollar      = 0x24
+_percent     = 0x25
+_ampersand   = 0x26
+_quotesingle = 0x27
+_parenleft   = 0x28
+_parenright  = 0x29
+_asterisk    = 0x2a
+_plus        = 0x2b
+_comma       = 0x2c
+_hyphen      = 0x2d
+_period      = 0x2e
+_slash       = 0x2f
+
+_0, _1, _2, _3, _4, _5, _6, _7, _8, _9 :: Word8
+_0 = 0x30
+_1 = 0x31
+_2 = 0x32
+_3 = 0x33
+_4 = 0x34
+_5 = 0x35
+_6 = 0x36
+_7 = 0x37
+_8 = 0x38
+_9 = 0x39
+
+_colon, _semicolon, _less, _equal, _greater, _question, _at :: Word8
+_colon      = 0x3a
+_semicolon  = 0x3b
+_less       = 0x3c
+_equal      = 0x3d
+_greater    = 0x3e
+_question   = 0x3f
+_at         = 0x40
+
+_A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z :: Word8
+_A = 0x41
+_B = 0x42
+_C = 0x43
+_D = 0x44
+_E = 0x45
+_F = 0x46
+_G = 0x47
+_H = 0x48
+_I = 0x49
+_J = 0x4a
+_K = 0x4b
+_L = 0x4c
+_M = 0x4d
+_N = 0x4e
+_O = 0x4f
+_P = 0x50
+_Q = 0x51
+_R = 0x52
+_S = 0x53
+_T = 0x54
+_U = 0x55
+_V = 0x56
+_W = 0x57
+_X = 0x58
+_Y = 0x59
+_Z = 0x5a
+
+_braketleft, _backslash, _bracketright, _circum, _underscore, _grave :: Word8
+_braketleft   = 0x5b
+_backslash    = 0x5c
+_bracketright = 0x5d
+_circum       = 0x5e
+_underscore   = 0x5f
+_grave        = 0x60
+
+_a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z :: Word8
+_a = 0x61
+_b = 0x62
+_c = 0x63
+_d = 0x64
+_e = 0x65
+_f = 0x66
+_g = 0x67
+_h = 0x68
+_i = 0x69
+_j = 0x6a
+_k = 0x6b
+_l = 0x6c
+_m = 0x6d
+_n = 0x6e
+_o = 0x6f
+_p = 0x70
+_q = 0x71
+_r = 0x72
+_s = 0x73
+_t = 0x74
+_u = 0x75
+_v = 0x76
+_w = 0x77
+_x = 0x78
+_y = 0x79
+_z = 0x7a
+
+_blaceleft, _bar, _braceright, _tilde, _del :: Word8
+_blaceleft  = 0x7b
+_bar        = 0x7c
+_braceright = 0x7d
+_tilde      = 0x7e
+_del        = 0x7f
+
+_nbsp :: Word8
+_nbsp = 0xa0
+
+_ordfeminine, _softhyphen, _mu, _ordmasculine :: Word8
+_ordfeminine  = 0xaa
+_softhyphen   = 0xad
+_mu           = 0xb5
+_ordmasculine = 0xba
+
+_s2, _s3, _s1, _1'4, _1'2, _3'4  :: Word8
+_s2 = 0xb2
+_s3 = 0xb3
+_s1 = 0xb9
+_1'4 = 0xbc
+_1'2 = 0xbd
+_3'4 = 0xbe
+
+_Agrave, _Odieresis, _Oslash, _Thorn :: Word8
+_Agrave    = 0xc0
+_Odieresis = 0xd6
+_Oslash    = 0xd8
+_Thorn     = 0xde
+
+_germandbls, _agrave, _odieresis, _oslash, _thorn, _ydieresis :: Word8
+_germandbls = 0xdf
+_agrave     = 0xe0
+_odieresis  = 0xf6
+_oslash     = 0xf8
+_thorn      = 0xfe
+_ydieresis  = 0xff
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,29 @@
+Copyright (c) 2012, IIJ Innovation Institute Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  * 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.
+  * Neither the name of the copyright holders 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 OWNER 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/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/word8.cabal b/word8.cabal
new file mode 100644
--- /dev/null
+++ b/word8.cabal
@@ -0,0 +1,20 @@
+Name:                   word8
+Version:                0.0.0
+Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
+Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
+License:                BSD3
+License-File:           LICENSE
+Synopsis:               Word8 library
+Description:            Word8 library to be used with Data.ByteString
+Category:               Data
+Cabal-Version:          >= 1.8
+Build-Type:             Simple
+
+Library
+  GHC-Options:          -Wall
+  Exposed-Modules:      Data.Word8
+  Build-Depends:        base >= 4 && < 5
+
+Source-Repository head
+  Type:                 git
+  Location:             https://github.com/kazu-yamamoto/word8
