diff --git a/uiop/run-program.lisp b/uiop/run-program.lisp
index 04dd0de91285a3a5421c05781ca9f81d3b5ede76..4cbf606a39a825ae84ff8a5fa599fbb145bd3f25 100644
--- a/uiop/run-program.lisp
+++ b/uiop/run-program.lisp
@@ -547,7 +547,7 @@ It returns a process-info object."
           (when process (prop 'process process)))
         #+lispworks
         (if wait
-            (prop 'exit-code (first process*))
+            (prop 'exit-code (or (second process*) (first process*)))
             (let ((mode (+ (if (eq input :stream) 1 0) (if (eq output :stream) 2 0))))
               (if (or (plusp mode) (eq error-output :stream))
                   (destructuring-bind (io err pid) process*
@@ -598,9 +598,13 @@ It returns a process-info object."
                    #+clozure (nth-value 1 (ccl:external-process-status process))
                    #+(or cmucl scl) (ext:process-exit-code process)
                    #+(or clasp ecl) (nth-value 1 (ext:external-process-wait process t))
-                   #+lispworks (funcall #+lispworks7+ #'sys:pipe-exit-status
-                                        #-lispworks7+ #'sys:pid-exit-status
-                                        process :wait t)
+                   #+lispworks
+                   ;; a signal is only returned on LispWorks 7+
+                   (multiple-value-bind (exit-code signal)
+                       (funcall #+lispworks7+ #'sys:pipe-exit-status
+                                #-lispworks7+ #'sys:pid-exit-status
+                                process :wait t)
+                     (or signal exit-code))
                    #+mkcl (mkcl:join-process process)
                    #+sbcl (sb-ext:process-exit-code process)))
               (setf (slot-value process-info 'exit-code) exit-code)