diff --git a/scribble-lib/scribble/private/manual-proc.rkt b/scribble-lib/scribble/private/manual-proc.rkt
index c34e053f..4ad930b6 100644
--- a/scribble-lib/scribble/private/manual-proc.rkt
+++ b/scribble-lib/scribble/private/manual-proc.rkt
@@ -458,7 +458,8 @@
         (make-flow
          (if short?
              ;; The single-line case:
-             (make-table-if-necessary
+             (top-align
+              make-table-if-necessary
               "prototype"
               (list
                (cons
@@ -481,7 +482,8 @@
                                       flow-spacer flow-spacer))]
                    [one-ok? (and (not (eq? mode 'new)) (tagged+arg-width . < . (- max-proto-width 5)))])
                (list
-                (make-table
+                (top-align
+                 make-table
                  "prototype"
                  (cons
                   (cons
@@ -538,8 +540,10 @@
                            (loop ((if dots-next? cddr cdr)
                                   args)))))))))))))))
      (if result-next-line?
-       (list (list (make-flow (make-table-if-necessary "prototype"
-                                                       (list end)))))
+       (list (list (make-flow (top-align
+                               make-table-if-necessary
+                               "prototype"
+                               (list end)))))
        null)
      (append-map
       (lambda (arg arg-contract arg-val)
@@ -563,21 +567,25 @@
                 (if (and (arg-optional? arg)
                          ((+ base-len 3 def-len) . >= . max-proto-width))
                   (list
-                   (make-table
+                   (top-align
+                    make-table
                     "argcontract"
                     (list base-list (list flow-spacer flow-spacer flow-spacer
                                           (to-flow "=") flow-spacer
                                           (make-flow (list arg-val))))))
-                  (make-table-if-necessary
-                   "argcontract"
-                   (list
-                    (append
-                     base-list
-                     (if (and (arg-optional? arg)
-                              ((+ base-len 3 def-len) . < . max-proto-width))
-                       (list flow-spacer (to-flow "=") flow-spacer
-                             (make-flow (list arg-val)))
-                       null)))))))))]
+                  (let ([show-default?
+                         (and (arg-optional? arg)
+                              ((+ base-len 3 def-len) . < . max-proto-width))])
+                    (top-align
+                     make-table-if-necessary
+                     "argcontract"
+                     (list
+                      (append
+                       base-list
+                       (if show-default?
+                           (list flow-spacer (to-flow "=") flow-spacer
+                                 (make-flow (list arg-val)))
+                           null))))))))))]
           [else null]))
       args
       arg-contracts
@@ -586,7 +594,8 @@
          (let ([result-block  (if (block? result-value)
                                   result-value
                                   (make-omitable-paragraph (list result-value)))])
-           (list (list (list (make-table
+           (list (list (list (top-align
+                              make-table
                               "argcontract"
                               (list (list
                                      (to-flow (make-element #f (list spacer "=" spacer)))
@@ -637,6 +646,24 @@
          ([(id) boolean?] [(id [arg any/c]) void? #:value value.value])
          desc ...)]))
 
+(define top-align-styles (make-hash))
+(define (top-align make-table style-name cols)
+  (if (null? cols)
+      (make-table style-name null)
+      (let* ([n (length (car cols))]
+             [k (cons style-name n)])
+        (make-table
+         (hash-ref top-align-styles
+                   k
+                   (lambda ()
+                     (define s
+                       (make-style style-name
+                                   (list (make-table-columns (for/list ([i n])
+                                                               (make-style #f '(top)))))))
+                     (hash-set! top-align-styles k s)
+                     s))
+         cols))))
+
 ;; ----------------------------------------
 
 (begin-for-syntax
@@ -980,7 +1007,8 @@
              (cond
               [(pair? v)
                (list
-                (make-table-if-necessary
+                (top-align
+                 make-table-if-necessary
                  "argcontract"
                  (list (list (to-flow (hspace 2))
                              (to-flow (to-element (field-name v)))
@@ -1099,7 +1127,8 @@
              (list
               (list
                ((if (zero? i) (add-background-label (or kind "value")) values)
-                (make-table-if-necessary
+                (top-align
+                 make-table-if-necessary
                  "argcontract"
                  (append
                   (list
@@ -1118,14 +1147,16 @@
                         null))))))))
              (if contract-on-first-line?
                  null
-                 (list (list (make-table-if-necessary
+                 (list (list (top-align
+                              make-table-if-necessary
                               "argcontract"
                               (list 
                                (list (to-flow (list spacer ":" spacer))
                                      (list contract-block)))))))
              (if (or single-line? (not result-block))
                  null
-                 (list (list (make-table-if-necessary
+                 (list (list (top-align
+                              make-table-if-necessary
                               "argcontract"
                               (list (list
                                      (to-flow (list spacer "=" spacer))
diff --git a/scribble-lib/scribble/private/manual-utils.rkt b/scribble-lib/scribble/private/manual-utils.rkt
index 05c47684..00599e60 100644
--- a/scribble-lib/scribble/private/manual-utils.rkt
+++ b/scribble-lib/scribble/private/manual-utils.rkt
@@ -2,7 +2,8 @@
 (require "../struct.rkt"
          "../base.rkt"
          (only-in "../core.rkt"
-                   content?)
+                   content?
+                   style?)
          racket/contract/base
          scheme/list)
 
@@ -13,7 +14,7 @@
  [flow-spacer flow?]
  [flow-spacer/n (-> exact-nonnegative-integer? flow?)]
  [flow-empty-line flow?]
- [make-table-if-necessary (content? list? . -> . (list/c (or/c omitable-paragraph? table?)))]
+ [make-table-if-necessary ((or/c style? string?) list? . -> . (list/c (or/c omitable-paragraph? table?)))]
  [current-display-width (parameter/c exact-nonnegative-integer?)])
 
 (define spacer (hspace 1))