When choosing this option, I tend to use language functions over other constructs.
The serious drawback of INotifyPropertyChanged is that it provides the property name as a string when updating, and your consumer classes should parse that string and decide how to act on it.
Using events, you can provide any delegate signature that is required by the event, and consumer classes can directly affect this change.
If you look under the hood, you will find that INotifyPropertyChanged is an event anyway, so why not use the events directly?