diff --git a/elisp/shm-evaporate.el b/elisp/shm-evaporate.el
--- a/elisp/shm-evaporate.el
+++ b/elisp/shm-evaporate.el
@@ -26,6 +26,14 @@
   "Face for text that will evaporate when modified/overwritten."
   :group 'shm-evaporate)
 
+(defun shm-evaporate-before-p ()
+  "Before an evaporating piece of code at point?"
+  (let ((os (remove-if-not
+             (lambda (o)
+               (overlay-get o 'shm-evaporate-overlay))
+             (overlays-in (point) (1+ (point))))))
+    (not (null os))))
+
 (defun shm-evaporate (beg end)
   "Make the region evaporate when typed over."
   (interactive "r")
diff --git a/elisp/shm-slot.el b/elisp/shm-slot.el
--- a/elisp/shm-slot.el
+++ b/elisp/shm-slot.el
@@ -55,16 +55,29 @@
 (defun shm/insert-undefined ()
   "Insert undefined."
   (interactive)
-  (save-excursion
-    (let ((point (point)))
-      (shm-insert-string "undefined")
-      (shm-evaporate point (point)))))
+  (let ((point (point)) (bumped nil))
+    (when (and (looking-back "[^[({;, ]")
+               (not (bolp)))
+      (shm-insert-string " ")
+      (setq point (1+ point)))
+    (when (and (looking-at "[^])},; ]+_*")
+               (not (eolp)))
+      (shm-insert-string " ")
+      (forward-char -1))
+    (shm-insert-string "undefined")
+    (shm-evaporate point (point))
+    (goto-char point)))
 
 (defun shm/insert-underscore ()
   "Insert underscore."
   (interactive)
   (save-excursion
     (let ((point (point)))
+      (when (looking-back "[a-zA-Z0-9]+_*")
+        (shm-insert-string " "))
+      (when (looking-at "[a-zA-Z0-9]+_*")
+        (shm-insert-string " ")
+        (forward-char -1))
       (shm-insert-string "_")
       (shm-evaporate point (point)))))
 
diff --git a/elisp/shm-yank-kill.el b/elisp/shm-yank-kill.el
--- a/elisp/shm-yank-kill.el
+++ b/elisp/shm-yank-kill.el
@@ -98,7 +98,8 @@
                (shm-in-string))
      (when (looking-back "[a-zA-Z0-9]+_*")
        (shm-insert-string " "))
-     (when (looking-at "[a-zA-Z0-9]+_*")
+     (when (and (looking-at "[a-zA-Z0-9]+_*")
+                (not (shm-evaporate-before-p)))
        (shm-insert-string " ")
        (forward-char -1)))
    (shm-insert-indented #'clipboard-yank)))
diff --git a/structured-haskell-mode.cabal b/structured-haskell-mode.cabal
--- a/structured-haskell-mode.cabal
+++ b/structured-haskell-mode.cabal
@@ -1,5 +1,5 @@
 name:                structured-haskell-mode
-version:             1.0.10
+version:             1.0.11
 synopsis:            Structured editing Emacs mode for Haskell
 description:         Structured editing Emacs mode for Haskell.
 homepage:            https://github.com/chrisdone/structured-haskell-mode
@@ -44,4 +44,4 @@
   build-depends:     base >= 4 && < 5
                    , haskell-src-exts == 1.15.*
                    , text
-                   , descriptive == 0.3.*
+                   , descriptive == 0.4.*
