add_option() takes an autoload argument. update_option() takes one too — and until recently ignored it for an option that already existed, so a plugin that only ever calls update_option() gets whatever the first write decided, forever.
add_option( 'my_cache', $data, '', 'no' ); // created as no
update_option( 'my_cache', $data ); // stays no
// changing it afterwards is a delete and re-add
delete_option( 'my_cache' );
add_option( 'my_cache', $data, '', 'no' );
The practical consequence is that fixing an autoload mistake in an already-deployed plugin needs a migration, not a code change — every existing install keeps the old flag. The other difference worth knowing: add_option() does nothing and returns false if the option exists, which makes it safe to call on every activation.