diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # language-ats
 
+# 1.7.9.0
+
+  * Support float literals as something other than double literals
+
 # 1.7.8.0
 
   * Add support for unsigned hexadecimal literals
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.8.0
+version:         1.7.9.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
@@ -53,7 +53,8 @@
 
 -- Floats
 @decimals = $digit+
-@float = @decimals \. @decimals ("f" | "")
+@float = @decimals \. @decimals "f"
+@double = @decimals \. @decimals
 
 -- Strings
 @string = \" ($printable # [\"\\] | @escape_str | $esc_char | \\ \n | \n)* \"
@@ -281,7 +282,8 @@
     <0> @integer                 { tok (\p s -> alex $ IntTok p (read s)) } -- FIXME shouldn't fail silenty on overflow
     <0> "0x" $hex+               { tok (\p s -> alex $ HexIntTok p (drop 2 s)) }
     <0> "0x" $hex+ u             { tok (\p s -> alex $ HexUintTok p (drop 2 (init s))) }
-    <0> @float                   { tok (\p s -> alex $ FloatTok p (read s)) }
+    <0> @float                   { tok (\p s -> alex $ FloatTok p (read (init s))) }
+    <0> @double                  { tok (\p s -> alex $ DoubleTok p (read s)) }
     <0> @char_lit                { tok (\p s -> alex $ CharTok p (toChar s)) }
     <0> @string                  { tok (\p s -> alex $ StringTok p s) }
 
@@ -434,6 +436,7 @@
            | HexIntTok AlexPosn String
            | HexUintTok AlexPosn String
            | FloatTok AlexPosn Float
+           | DoubleTok AlexPosn Double
            | CharTok AlexPosn Char
            | StringTok AlexPosn String
            | Special AlexPosn String
@@ -565,6 +568,7 @@
     pretty (HexIntTok _ hi) = "0x" <> text hi
     pretty (HexUintTok _ hi) = "0x" <> text hi <> "u"
     pretty (FloatTok _ x) = pretty x
+    pretty (DoubleTok _ x) = pretty x
     pretty (CharTok _ c) = squotes (pretty c)
     pretty (StringTok _ s) = text s
     pretty (Special _ s) = text s
@@ -600,6 +604,7 @@
 token_posn (Keyword p _) = p
 token_posn (IntTok p _) = p
 token_posn (FloatTok p _) = p
+token_posn (DoubleTok p _) = p
 token_posn (StringTok p _) = p
 token_posn (Special p _) = p
 token_posn (CBlockLex p _) = p
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
@@ -153,6 +153,7 @@
     hexLit { HexIntTok _ $$ }
     hexULit { HexUintTok _ $$ }
     floatLit { FloatTok _ $$ }
+    doubleLit { DoubleTok _ $$ }
     specialIdentifier { $$@SpecialIdentifier{} }
     foldAt { Identifier $$ "fold@" }
     identifier { $$@Identifier{} }
@@ -350,6 +351,7 @@
         | hexLit { HexLit $1 }
         | hexULit { HexUintLit $1 }
         | floatLit { FloatLit $1 }
+        | doubleLit { DoubleLit $1 }
         | string { StringLit $1 }
         | charLit { CharLit $1 }
         | doubleParens { VoidLiteral $1 }
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
@@ -139,7 +139,8 @@
         a (HexUintLitF hi)              = "0x" <> text hi <> "u"
         a (LambdaF _ lt p e)            = prettyLam "lam" p lt e
         a (LinearLambdaF _ lt p e)      = prettyLam "llam" p lt e
-        a (FloatLitF f)                 = pretty f
+        a (FloatLitF f)                 = pretty f <> "f"
+        a (DoubleLitF f)                = pretty f
         a (StringLitF s)                = text s -- FIXME escape indentation in multi-line strings.
         a (ParenExprF _ e)              = parens e
         a (UnaryF op e) = pretty op <> pretty 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
@@ -361,6 +361,7 @@
                        }
                   | UintLit Natural -- ^ E.g. @1000u@
                   | FloatLit Float
+                  | DoubleLit Double
                   | IntLit Integer
                   | HexLit String
                   | HexUintLit String
@@ -415,6 +416,7 @@
                      | IfF x x (Maybe x)
                      | UintLitF Natural
                      | FloatLitF Float
+                     | DoubleLitF Double
                      | IntLitF Integer
                      | HexLitF String
                      | HexUintLitF String
diff --git a/test/data/spec.dats b/test/data/spec.dats
new file mode 100644
--- /dev/null
+++ b/test/data/spec.dats
@@ -0,0 +1,27 @@
+#include "share/atspre_staload.hats"
+
+staload "SATS/futhark.sats"
+staload "SATS/futhark-arr.sats"
+staload "SATS/futhark-stats.sats"
+staload "SATS/futhark-linalg.sats"
+
+implement main0 () =
+  {
+    val arr0 = $arrpsz{float} (1.0f, 2.0f, 3.0f)
+    var arr1 = $arrpsz{float} (1.0f, 2.0f, 3.0f)
+    val ctx_cfg = futhark_context_config_new()
+    val ctx = futhark_context_new(ctx_cfg)
+    val fut_arr0 = futhark_new_f32_1d(ctx, arr0, 3)
+    val fut_arr1 = futhark_new_f32_1d(ctx, arr1, 3)
+    var ret: float
+    val _ = futhark_entry_mean_f32(ctx, ret, fut_arr0)
+    val () = println!(ret)
+    val _ = futhark_entry_dotprod_f32(ctx, ret, fut_arr0, fut_arr1)
+    val () = println!(ret)
+    val _ = futhark_free_f32_1d(ctx, fut_arr0)
+    val _ = futhark_free_f32_1d(ctx, fut_arr1)
+    val () = futhark_context_free(ctx)
+    val () = futhark_context_config_free(ctx_cfg)
+    val () = arrayptr_free (arr0)
+    val () = arrayptr_free (arr1)
+  }
diff --git a/test/data/spec.out b/test/data/spec.out
new file mode 100644
--- /dev/null
+++ b/test/data/spec.out
@@ -0,0 +1,27 @@
+#include "share/atspre_staload.hats"
+
+staload "SATS/futhark.sats"
+staload "SATS/futhark-arr.sats"
+staload "SATS/futhark-stats.sats"
+staload "SATS/futhark-linalg.sats"
+
+implement main0 () =
+  {
+    val arr0 = $arrpsz{float}(1.0f, 2.0f, 3.0f)
+    var arr1 = $arrpsz{float}(1.0f, 2.0f, 3.0f)
+    val ctx_cfg = futhark_context_config_new()
+    val ctx = futhark_context_new(ctx_cfg)
+    val fut_arr0 = futhark_new_f32_1d(ctx, arr0, 3)
+    val fut_arr1 = futhark_new_f32_1d(ctx, arr1, 3)
+    var ret: float
+    val _ = futhark_entry_mean_f32(ctx, ret, fut_arr0)
+    val () = println!(ret)
+    val _ = futhark_entry_dotprod_f32(ctx, ret, fut_arr0, fut_arr1)
+    val () = println!(ret)
+    val _ = futhark_free_f32_1d(ctx, fut_arr0)
+    val _ = futhark_free_f32_1d(ctx, fut_arr1)
+    val () = futhark_context_free(ctx)
+    val () = futhark_context_config_free(ctx_cfg)
+    val () = arrayptr_free(arr0)
+    val () = arrayptr_free(arr1)
+  }
