diff --git a/code/describe.lisp b/code/describe.lisp
index 0f19cf774f7821a844366bbaa25bb6d433096a40..92f17fc46c59feeb5364f491766d058f80a8cdf4 100644
--- a/code/describe.lisp
+++ b/code/describe.lisp
@@ -199,9 +199,13 @@
       (describe (cadr plist)))))
 
 (defun describe-structure (x)
-  (format t "~&~S is a structure of type ~A." x (c::structure-ref x 0))
-  (dolist (slot (cddr (inspect::describe-parts x)))
-    (format t "~%~A: ~S." (car slot) (cdr slot))))
+  (cond ((and (fboundp 'pcl::std-instance-p)
+	      (pcl::std-instance-p x))
+	 (pcl::describe-object x *standard-output*))
+	(t
+	 (format t "~&~S is a structure of type ~A." x (c::structure-ref x 0))
+	 (dolist (slot (cddr (inspect::describe-parts x)))
+	   (format t "~%~A: ~S." (car slot) (cdr slot))))))
 
 (defun describe-array (x)
   (let ((rank (array-rank x)))
@@ -235,6 +239,8 @@
      (describe-function-lex-closure x macro-p))
     ((#.vm:function-header-type #.vm:closure-function-header-type)
      (describe-function-compiled x macro-p))
+    (#.vm:funcallable-instance-header-type
+     (pcl::describe-object x *standard-output*))
     (t
      (format t "~&It is an unknown type of function."))))
 
@@ -249,11 +255,11 @@
 	    (*print-length* nil))
 	(multiple-value-bind
 	    (type where)
-	    (if (stringp name)
-		(values (%function-header-type x)
-			:defined)
+	    (if (or (symbolp name) (and (listp name) (eq (car name) 'setf)))
 		(values (type-specifier (info function type name))
-			(info function where-from name)))
+			(info function where-from name))
+		(values (%function-header-type x)
+			:defined))
 	  (when (consp type)
 	    (format t "~&Its ~(~A~) argument types are:~%  ~S"
 		    where (second type))