diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # language-ats
 
+## 1.7.6.0
+
+  * Use `Natural`/`Integer` for literals
+
 ## 1.7.5.0
 
   * Fix `StaticExpression` to allow calls with dynamic components
diff --git a/language-ats.cabal b/language-ats.cabal
--- a/language-ats.cabal
+++ b/language-ats.cabal
@@ -1,6 +1,6 @@
 cabal-version:   1.18
 name:            language-ats
-version:         1.7.5.0
+version:         1.7.6.0
 license:         BSD3
 license-file:    LICENSE
 copyright:       Copyright: (c) 2018-2019 Vanessa McHale
diff --git a/src/Language/ATS/Lexer.x b/src/Language/ATS/Lexer.x
--- a/src/Language/ATS/Lexer.x
+++ b/src/Language/ATS/Lexer.x
@@ -23,6 +23,7 @@
 import Data.Bool (bool)
 import Control.DeepSeq (NFData)
 import GHC.Generics (Generic)
+import GHC.Natural (Natural)
 import Text.PrettyPrint.ANSI.Leijen hiding (line, bool, column, (<$>))
 
 }
@@ -428,7 +429,7 @@
 data Token = Identifier AlexPosn String
            | SpecialIdentifier AlexPosn String
            | Keyword AlexPosn Keyword
-           | IntTok AlexPosn Int
+           | IntTok AlexPosn Integer
            | HexIntTok AlexPosn String
            | FloatTok AlexPosn Float
            | CharTok AlexPosn Char
@@ -444,7 +445,7 @@
            | CommentEnd AlexPosn
            | CommentContents AlexPosn String
            | MacroBlock AlexPosn String
-           | UintTok AlexPosn Word
+           | UintTok AlexPosn Natural
            | SignatureTok AlexPosn String
            | DoubleParenTok AlexPosn
            | DoubleBracesTok AlexPosn
@@ -571,7 +572,7 @@
     pretty CommentEnd{} = "*)"
     pretty (CommentContents _ s) = text s
     pretty (FuncType _ s) = text s
-    pretty (UintTok _ u) = pretty u
+    pretty (UintTok _ u) = pretty (fromIntegral u :: Integer)
     pretty (SignatureTok _ s) = ":" <> text s
     pretty (Operator _ s) = text s
     pretty (MacroBlock _ s) = "#"
diff --git a/src/Language/ATS/Parser.y b/src/Language/ATS/Parser.y
--- a/src/Language/ATS/Parser.y
+++ b/src/Language/ATS/Parser.y
@@ -931,7 +931,7 @@
          | dataprop IdentifierOr SortArgs vbar {% left $ Expected $4 "=" "|" }
 
 EitherInt :: { Fix }
-          : intLit { Left $1 }
+          : intLit { Left (fromIntegral $1) }
           | parens(Operator) { Right $1 }
 
 Fixity :: { Fixity AlexPosn }
@@ -1058,13 +1058,13 @@
             | overload doubleSqBrackets with IdentifierOr { OverloadIdent $1 "[]" (Unqualified $4) Nothing }
             | overload BinOp with Name { OverloadOp $1 $2 $4 Nothing }
             | overload BinOp with customOperator { OverloadOp $1 $2 (Unqualified $ to_string $4) Nothing }
-            | overload BinOp with identifierSpace of intLit { OverloadOp $1 $2 (Unqualified $ to_string $4) (Just $6) }
+            | overload BinOp with identifierSpace of intLit { OverloadOp $1 $2 (Unqualified $ to_string $4) (Just $ fromIntegral $6) }
             | overload identifierSpace with Name { OverloadIdent $1 (to_string $2) $4 Nothing }
             | overload identifierSpace with identifierSpace { OverloadIdent $1 (to_string $2) (Unqualified $ to_string $4) Nothing }
-            | overload identifierSpace with identifierSpace of intLit { OverloadIdent $1 (to_string $2) (Unqualified $ to_string $4) (Just $6) }
+            | overload identifierSpace with identifierSpace of intLit { OverloadIdent $1 (to_string $2) (Unqualified $ to_string $4) (Just $ fromIntegral $6) }
             | overload tilde with identifier { OverloadIdent $1 "~" (Unqualified $ to_string $4) Nothing } -- FIXME figure out a general solution.
-            | overload tilde with identifierSpace of intLit { OverloadIdent $1 "~" (Unqualified $ to_string $4) (Just $6) }
-            | overload doubleSqBrackets with identifierSpace of intLit { OverloadIdent $1 "[]" (Unqualified $ to_string $4) (Just $6) }
+            | overload tilde with identifierSpace of intLit { OverloadIdent $1 "~" (Unqualified $ to_string $4) (Just $ fromIntegral $6) }
+            | overload doubleSqBrackets with identifierSpace of intLit { OverloadIdent $1 "[]" (Unqualified $ to_string $4) (Just $ fromIntegral $6) }
             | overload dot identifierSpace with Name { OverloadIdent $1 ('.' : (to_string $3)) $5 Nothing }
             | assume identifierSpace SortArgs eq Type { Assume (Unqualified (to_string $2)) $3 $5 }
             | assume Name SortArgs eq Type { Assume $2 $3 $5 }
diff --git a/src/Language/ATS/PrettyPrint.hs b/src/Language/ATS/PrettyPrint.hs
--- a/src/Language/ATS/PrettyPrint.hs
+++ b/src/Language/ATS/PrettyPrint.hs
@@ -132,7 +132,7 @@
         a (LetF _ e e')          = flatAlt
             ("let" <$> indent 2 (pretty e) <$> endLet e')
             ("let" <+> pretty e <$> endLet e')
-        a (UintLitF u)                  = pretty u <> "u"
+        a (UintLitF u)                  = pretty (fromIntegral u :: Integer) <> "u"
         a (IntLitF i)                   = pretty i
         a (HexLitF hi)                  = "0x" <> text hi
         a (LambdaF _ lt p e)            = prettyLam "lam" p lt e
diff --git a/src/Language/ATS/Types.hs b/src/Language/ATS/Types.hs
--- a/src/Language/ATS/Types.hs
+++ b/src/Language/ATS/Types.hs
@@ -56,6 +56,7 @@
 import           Data.List.NonEmpty (NonEmpty)
 import qualified Data.Map           as M
 import           GHC.Generics       (Generic)
+import           GHC.Natural        (Natural)
 import           Language.ATS.Lexer (Addendum (..))
 
 type Fix = Either Int String
@@ -308,7 +309,7 @@
 
 data StaticExpression a = StaticVal (Name a)
                         | StaticBinary (BinOp a) (StaticExpression a) (StaticExpression a)
-                        | StaticInt Int
+                        | StaticInt Integer
                         | StaticHex String
                         | SPrecede (StaticExpression a) (StaticExpression a)
                         | SPrecedeList { _sExprs :: [StaticExpression a] }
@@ -328,7 +329,7 @@
 
 data StaticExpressionF a x = StaticValF (Name a)
                            | StaticBinaryF (BinOp a) x x
-                           | StaticIntF Int
+                           | StaticIntF Integer
                            | StaticHexF String
                            | SPrecedeF x x
                            | SPrecedeListF [x]
@@ -363,9 +364,9 @@
                        , whenTrue :: Expression a -- ^ Expression to be returned when true
                        , elseExpr :: Maybe (Expression a) -- ^ Expression to be returned when false
                        }
-                  | UintLit Word -- ^ E.g. @1000u@
+                  | UintLit Natural -- ^ E.g. @1000u@
                   | FloatLit Float
-                  | IntLit Int
+                  | IntLit Integer
                   | HexLit String
                   | UnderscoreLit a
                   | Lambda a (LambdaType a) (Pattern a) (Expression a) -- TODO: Fix
@@ -416,9 +417,9 @@
                      | NamedValF (Name a)
                      | ListLiteralF a String (Type a) [x]
                      | IfF x x (Maybe x)
-                     | UintLitF Word
+                     | UintLitF Natural
                      | FloatLitF Float
-                     | IntLitF Int
+                     | IntLitF Integer
                      | HexLitF String
                      | UnderscoreLitF a
                      | LambdaF a (LambdaType a) (Pattern a) x
diff --git a/test/data/memchr.out b/test/data/memchr.out
new file mode 100644
--- /dev/null
+++ b/test/data/memchr.out
@@ -0,0 +1,32 @@
+// bad (?) idea: use rawmemchr + append lol
+fn memchr
+{ l : addr | l != null }{m:nat}{ n : nat | n <= m }(bytes_v(l,m)
+                                                   | ptr(l), int, size_t(n)) :
+  [ l0 : addr | l0 == null || l0 >= l && l0-l <= m ] ( bytes_v(l, l0-l)
+                                                     , bytes_v(l0, l+m-l0)
+                                                     | ptr(l0)) =
+  "mac#"
+
+fn memchr2_rs
+{ l : addr | l != null }{m:nat}{ n : nat | n <= m }(!bytes_v(l, m)
+                                                   | ptr(l), char, char, size_t(n)) :
+  [ k : nat | k <= n || k == 18446744073709551615 ] size_t(k) =
+  "ext#"
+
+fn memchr2
+{ l : addr | l != null }{m:nat}{ n : nat | n <= m }(!bytes_v(l, m)
+                                                   | ptr(l), char, char, size_t(n)) :
+  Option_vt([ k : nat | k <= n ] size_t(k)) =
+  "ext#"
+
+fn memchr3_rs
+{ l : addr | l != null }{m:nat}{ n : nat | n <= m }(!bytes_v(l, m)
+                                                   | ptr(l), char, char, char, size_t(n)) :
+  [ k : nat | k <= n || k == 18446744073709551615 ] size_t(k) =
+  "ext#"
+
+fn memchr3
+{ l : addr | l != null }{m:nat}{ n : nat | n <= m }(!bytes_v(l, m)
+                                                   | ptr(l), char, char, char, size_t(n)) :
+  Option_vt([ k : nat | k <= n ] size_t(k)) =
+  "ext#"
diff --git a/test/data/memchr.sats b/test/data/memchr.sats
new file mode 100644
--- /dev/null
+++ b/test/data/memchr.sats
@@ -0,0 +1,19 @@
+// bad (?) idea: use rawmemchr + append lol
+fn memchr { l : addr | l != null }{m:nat}{ n : nat | n <= m }(bytes_v(l,m) | ptr(l), int, size_t(n)) :
+  [ l0 : addr | l0 == null || l0 >= l && l0-l <= m ] (bytes_v(l, l0-l), bytes_v(l0, l+m-l0)| ptr(l0)) =
+  "mac#"
+
+fn memchr2_rs { l : addr | l != null }{m:nat}{ n : nat | n <= m }(!bytes_v(l, m) | ptr(l), char, char, size_t(n)) :
+  [ k : nat | k <= n || k == 18446744073709551615 ] size_t(k) =
+  "ext#"
+
+fn memchr2 { l : addr | l != null }{m:nat}{ n : nat | n <= m }(!bytes_v(l, m) | ptr(l), char, char, size_t(n)) :
+  Option_vt([ k : nat | k <= n ] size_t(k)) =
+  "ext#"
+
+fn memchr3_rs { l : addr | l != null }{m:nat}{ n : nat | n <= m }(!bytes_v(l, m) | ptr(l), char, char, char, size_t(n)) 
+  : [ k : nat | k <= n || k == 18446744073709551615 ] size_t(k) =
+  "ext#"
+fn memchr3 { l : addr | l != null }{m:nat}{ n : nat | n <= m }(!bytes_v(l, m) | ptr(l), char, char, char, size_t(n)) 
+  : Option_vt([ k : nat | k <= n ] size_t(k)) =
+  "ext#"
