diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for simple-prompt
 
+## 0.2.3 (2024-06-13)
+- getGenericPrompt: adapt prompt suffix for final newline or colon
+- clearedInput no longer prints short duration for any buffered input
+
 ## 0.2.2 (2023-10-27)
 - add promptKeyPress
 
diff --git a/simple-prompt.cabal b/simple-prompt.cabal
--- a/simple-prompt.cabal
+++ b/simple-prompt.cabal
@@ -1,5 +1,5 @@
 name:                simple-prompt
-version:             0.2.2
+version:             0.2.3
 synopsis:            Simple commandline text prompt functions
 description:
         The library provides prompt functions for reading user input:
@@ -10,7 +10,7 @@
 license-file:        LICENSE
 author:              Jens Petersen <juhpetersen@gmail.com>
 maintainer:          Jens Petersen <juhpetersen@gmail.com>
-copyright:           2023  Jens Petersen <juhpetersen@gmail.com>
+copyright:           2023-2024  Jens Petersen <juhpetersen@gmail.com>
 category:            System
 homepage:            https://github.com/juhp/simple-prompt
 bug-reports:         https://github.com/juhp/simple-prompt/issues
@@ -24,8 +24,9 @@
                      || == 8.10.7
                      || == 9.0.2
                      || == 9.2.8
-                     || == 9.4.7
-                     || == 9.6.3
+                     || == 9.4.8
+                     || == 9.6.5
+                     || == 9.8.2
 
 source-repository head
   type:                git
@@ -36,6 +37,7 @@
                        exceptions,
                        extra,
                        haskeline > 0.8,
+                       safe,
                        time
 
   default-language:    Haskell2010
diff --git a/src/SimplePrompt.hs b/src/SimplePrompt.hs
--- a/src/SimplePrompt.hs
+++ b/src/SimplePrompt.hs
@@ -22,14 +22,14 @@
 #include "monadconstraint.h"
 
 -- FIXME use haveTerminalUI ?
--- | prompt which drops buffered input (using clearedInput)
+-- | prompt which drops buffered input (using `clearedInput`)
 --
 -- Ignores buffered input lines (ie if input line gotten in under 5ms)
 prompt :: MONADCONSTRAINT => String -> m String
 prompt = runPrompt . clearedInput . getPromptLine
 
 -- FIXME non-empty?
--- | reads string with initial input (using clearedInput)
+-- | reads string with initial input (using `clearedInput`)
 promptInitial :: MONADCONSTRAINT => String -> String -> m String
 promptInitial s = runPrompt . clearedInput . getPromptInitial s
 
@@ -37,7 +37,7 @@
 promptBuffered :: MONADCONSTRAINT => String -> m String
 promptBuffered = runPrompt . getPromptLine
 
--- | reads non-empty string (using nonEmptyInput)
+-- | reads non-empty string (using `nonEmptyInput`)
 promptNonEmpty :: MONADCONSTRAINT => String -> m String
 promptNonEmpty = runPrompt . nonEmptyInput . getPromptLine
 
@@ -45,7 +45,7 @@
 promptPassword :: MONADCONSTRAINT => String -> m String
 promptPassword = runPrompt . nonEmptyInput . getPromptPassword
 
--- | prompt for character key
+-- | prompt for a printable character
 promptChar :: MONADCONSTRAINT => String -> m Char
 promptChar =
   runPrompt . clearedInput . getPromptChar
@@ -73,7 +73,7 @@
         "no" -> Just False
         _ ->  Nothing
 
--- | Yes-No prompt with default (uses clearedInput)
+-- | Yes-No prompt with default (uses `clearedInput`)
 yesNoDefault :: MONADCONSTRAINT => Bool -> String -> m Bool
 yesNoDefault yes desc =
   runPrompt . mapInput maybeYN' . clearedInput . getPromptLine $
diff --git a/src/SimplePrompt/Internal.hs b/src/SimplePrompt/Internal.hs
--- a/src/SimplePrompt/Internal.hs
+++ b/src/SimplePrompt/Internal.hs
@@ -24,6 +24,7 @@
 #endif
 import Control.Monad.IO.Class (liftIO, MonadIO)
 import Data.Time.Clock (diffUTCTime, getCurrentTime)
+import Safe (lastMay)
 
 import System.Console.Haskeline
 
@@ -33,20 +34,26 @@
 getGenericPrompt :: MonadIO m => (String -> InputT m (Maybe a))
                  -> String -> InputT m a
 getGenericPrompt prompter s =
-  prompter (s ++ ": ") >>=
+  let suff =
+        case lastMay s of
+          Just '\n' -> ""
+          Just ':' -> " "
+          _ -> ": "
+  in
+  prompter (s ++ suff) >>=
   maybe (error "could not read input!") return
 
--- | like getInputLine, but error if fails
+-- | like `getInputLine`, but error if fails
 getPromptLine :: MONADCONSTRAINT => String -> InputT m String
 getPromptLine =
   getGenericPrompt getInputLine
 
--- | like getPromptLine, but with initial input
+-- | like `getPromptLine`, but with initial input
 getPromptInitial :: MONADCONSTRAINT => String -> String -> InputT m String
 getPromptInitial s i =
   getGenericPrompt (`getInputLineWithInitial` (i,"")) s
 
--- | like getInputChar, but error if fails
+-- | like `getInputChar`, but error if fails
 getPromptChar :: MONADCONSTRAINT => String -> InputT m Char
 getPromptChar =
   getGenericPrompt getInputChar
@@ -87,9 +94,8 @@
   start <- liftIO getCurrentTime
   input <- prompter
   end <- liftIO getCurrentTime
-  let diff = diffUTCTime end start
-  if diff < 0.005
+  if diffUTCTime end start < 0.005
     then do
-    outputStrLn $ "ignoring buffered input: " ++ show diff ++ " too quick"
+    outputStrLn "dropped buffered input"
     clearedInput prompter
     else return input
