I've had an issue with defrecord-types being converted into ordinary maps somewhere, which was relatively hard to track down inside a deep structure since they are pprinted as the same thing by default.
The following code patches into the pprint dispatch and prints the type around values; it turned out to be quite useful, but feels hackish.
Maybe something like that would be useful to integrate into clojure.pprint directly (there are a number of cosmetic options already), i.e. into clojure.pprint/write-out.
Only printing {{(type)}} may not be enough in some cases; so an option to print all metadata would be nice.
Maybe something like {{:metadata nil}} as default, {{:metadata :type}} to print types (but also for non-IMetas, using {{(type)}} and {{:metadata true}} to print metadata for IMetas using {{(meta)}}.
(defn pprint-with-type
([object] (pprint object *out*))
([object writer]
; keep original dispatch.
; calling it directly will print only that object,
; but return to our dispatch for subobjects.
(let [dispatch clojure.pprint/*print-pprint-dispatch*]
(binding [clojure.pprint/*print-pprint-dispatch*
(fn [obj]
(if (instance? clojure.lang.IMeta obj)
(do (print "^{:type ")
(dispatch (type obj))
(print "} ")
(clojure.pprint/pprint-newline :fill)
(dispatch obj))
(do (print "(^:type ")
(dispatch (type obj))
(print " ")
(clojure.pprint/pprint-newline :fill)
(dispatch obj)
(print ")"))))]
(clojure.pprint/pprint object writer)))))