It would be possible to have semantics similar to what you describe if a weak reference with a notifier were regarded similarly to an object with a finalizer, which is to say that when the object was considered to no longer be of interest to anybody, it would be queued for finalization and notification; the queue entry would be considered a live reference, so the object would not actually be collected until it was acted upon.
Since that isn't possible, the best feasible approach might probably be to have all "I'm interested in this object" references point to a lightweight wrapper object which would in turn point to the real object, and have the "weak" references point to a different wrapper which would also point to the real object. The first wrapper should hold a reference to the second, but not vice versa. The first wrapper should have a finalizer which will trigger appropriate code when it goes out of scope.
Unfortunately, I haven't seen any complete implementations of such a strategy. There are some important caveats to consider. Among them: (1) finalizers should never wait on locks, nor do anything that could throw an exception; (2) code which accesses other objects which might have gone out of scope must be prepared for the possibility that they may have already been finalized, be in the process of being finalized, be awaiting finalization, or still have live references elsewhere; (3) if a finalizer stores a rooted reference to a finalizable object which has been found eligible for garbage collection, such an object may be finalized even though the live reference exists.