diff --git a/pd/src/m_class.c b/pd/src/m_class.c
index a9d296369656927a5b2948915e71858ed620bc23..b0d9b68722f128ec52ace505f9f6d9fb52bc6577 100644
--- a/pd/src/m_class.c
+++ b/pd/src/m_class.c
@@ -99,18 +99,29 @@ char *type_hint(t_symbol *s, int argc, t_atom *argv, int dostof)
     {
         if (symbol_can_float(atom_getsymbolarg(0, argc, argv), &f))
         {
-            sprintf(hint, " (Note: this symbol message has a floatlike payload "
-                "which cannot be saved properly. Did you mean 'float %s'?)",
-                argv->a_w.w_symbol->s_name);
+            if (s == &s_symbol)
+                sprintf(hint, " (Warning: symbol message with numeric payload "
+                "detected. This data cannot be saved properly in a patch.");
+            else
+                sprintf(hint, " (Note: '%s' is actually a symbol atom, not "
+                    "a float)",
+                    argv->a_w.w_symbol->s_name);
             return hint;
         }
         else if (f == -1 || f == 1)
         {
                 /* For values which would overflow, give a hint but don't
                    suggest float type */
-            sprintf(hint, " (Note: this symbol message has an %s floatlike "
-                "payload which cannot be saved properly.",
-                f == 1 ? "overflowing" : "underflowing");
+            if (s == &s_symbol)
+                sprintf(hint, " (Note: this symbol message has an %s floatlike "
+                    "payload which cannot be saved properly.",
+                    f == 1 ? "overflowing" : "underflowing");
+            else
+                sprintf(hint, " (Note: '%s' is actually a symbol atom. If you "
+                    "save it Pd will parse it as a float and cause an %s "
+                    "error.",
+                    argv->a_w.w_symbol->s_name,
+                    f == 1 ? "overflow" : "underflow");
             return hint;
         }
     }
@@ -129,13 +140,33 @@ char *type_hint(t_symbol *s, int argc, t_atom *argv, int dostof)
         {
                 /* For values which would overflow, give a hint but don't
                    suggest float type */
-            sprintf(hint, " (Note: this symbol atom has an %s floatlike "
+            sprintf(hint, " (Note: the symbol atom '%s' has an %s floatlike "
                 "payload which cannot be saved properly.",
+                s->s_name,
                 f == 1 ? "overflowing" : "underflowing");
             return hint;
         }
     }
 
+        /* Now that we've checked for symbols that could be floats, let's
+           catch the generic case where a user entered a symbol payload for a
+           "float" message. This can be typed into a messsage box, for
+           example. We also check for empty symbol payload here, and other
+           odd atom types */
+    if (s && s == &s_float && argc && argv->a_type != A_FLOAT)
+    {
+        if (argv->a_type == A_SYMBOL && argv->a_w.w_symbol == &s_)
+            sprintf(hint, " (Expected a float argument but got empty symbol)");
+        else if (argv->a_type == A_SYMBOL)
+            sprintf(hint, " (Expected a float argument but got '%s')",
+                argv->a_w.w_symbol->s_name);
+        else if (argv->a_type == A_POINTER)
+            sprintf(hint, " (Expected a float argument but got a gpointer)");
+        else
+            sprintf(hint, " (Note: got an argument that's not a float)");
+        return hint;
+    }
+
     hint[0] = '\0';
     return hint;
 }
@@ -150,7 +181,7 @@ static void pd_defaultanything(t_pd *x, t_symbol *s, int argc, t_atom *argv)
 static void pd_defaultbang(t_pd *x)
 {
     if (*(*x)->c_listmethod != pd_defaultlist)
-        (*(*x)->c_listmethod)(x, 0, 0, 0);
+        (*(*x)->c_listmethod)(x, &s_bang, 0, 0);
     else (*(*x)->c_anymethod)(x, &s_bang, 0, 0);
 }
 
@@ -165,7 +196,7 @@ static void pd_defaultpointer(t_pd *x, t_gpointer *gp)
     {
         t_atom at;
         SETPOINTER(&at, gp);
-        (*(*x)->c_listmethod)(x, 0, 1, &at);
+        (*(*x)->c_listmethod)(x, &s_pointer, 1, &at);
     }
     else
     {
@@ -181,7 +212,7 @@ static void pd_defaultfloat(t_pd *x, t_float f)
     {
         t_atom at;
         SETFLOAT(&at, f);
-        (*(*x)->c_listmethod)(x, 0, 1, &at);
+        (*(*x)->c_listmethod)(x, &s_float, 1, &at);
     }
     else
     {
@@ -197,7 +228,7 @@ static void pd_defaultsymbol(t_pd *x, t_symbol *s)
     {
         t_atom at;
         SETSYMBOL(&at, s);
-        (*(*x)->c_listmethod)(x, 0, 1, &at);
+        (*(*x)->c_listmethod)(x, &s_symbol, 1, &at);
     }
     else
     {
@@ -986,8 +1017,10 @@ badarg:
        message that contains it (so it can be selected when 'Find
        Error' is used). */
     x = pd_mess_from_responder(x);
-    pd_error(x, "Bad arguments for message '%s' to object '%s'",
-        s->s_name, c->c_name->s_name);
+    pd_error(x, "Bad arguments for message '%s' to object '%s'%s",
+        s->s_name,
+        c->c_name->s_name,
+        type_hint(s, argc, argv, 1));
 lastmess:
     last_typedmess = s;    
     last_typedmess_pd = x;
@@ -1063,7 +1096,10 @@ t_gotfn getfn(t_pd *x, t_symbol *s)
 
     for (i = c->c_nmethod, m = c->c_methods; i--; m++)
         if (m->me_name == s) return(m->me_fun);
-    pd_error(x, "%s: no method for message '%s'", c->c_name->s_name, s->s_name);
+    pd_error(x, "%s: no method for message '%s'%s",
+            c->c_name->s_name,
+            s->s_name,
+            type_hint(s, 0, 0, 1));
     return((t_gotfn)nullfn);
 }