I'm using after to create a delayed callback. I noticed though that many different objects have an after method, and it isn't clear if there's any difference between calling after on say a tk.Frame or a tk.Button.
I haven't seen a single guide mention if you can expect identical behavior regardless of what object after is called on. Looking at the implementation, it seems like it just delegates to self.tk.call('after', ms, name) in a common base class of widgets, but that alone doesn't mean that the behavior will be identical for all subclasses.
If I have multiple widgets on-hand when I need to call after, is there any reason to choose one over another, or can I expect identical behavior regardless?
I'm using after to create a delayed callback. I noticed though that many different objects have an after method, and it isn't clear if there's any difference between calling after on say a tk.Frame or a tk.Button.

No, there is no difference. You can call after using any widget you want and it will behave exactly the same.

Looking at the implementation, it seems like it just delegates to self.tk.call('after', ms, name) in a common base class of widgets, but that alone doesn't mean that the behavior will be identical for all subclasses.

Actually, it does. The fact that you call it as a method on a widget is an artifact of the Tkinter implementation. In the underlying tcl/tk library it's just a function call that isn't tied to any widget.
What widget should after be called on?