Register/unregister class confusion

When do you need to explicitly register/unregister a class? I was under the impression that any class that had a bl_idname would be taken care of by “bpy.utils.register_module(name)” and “bpy.utils.unregister_module(name)” , but that doesn’t seem to be the case. They’ll register fine, but when refreshing scripts via F8 the old code doesn’t seem to be properly unregistered…