Snoozy: A lazy reevaluation upon get
I have some bad news for you... According to MSDN only one thread can enter an upgradeable read lock:


  Only one thread can enter upgradeable mode at any given time. If a thread is in upgradeable mode, and there are no threads waiting to enter write mode, any number of other threads can enter read mode, even if there are threads waiting to enter upgradeable mode.


That means your current implementation is basically just exclusive locking.



You should validate your parameters:

public Snoozy(Func&lt;T&gt; valueFactory)
{
    if (valueFactory == null)
    {
        throw new ArgumentNullException(nameof(valueFactory));
    }


and likewise in your conversions.



On the whole, this feels like a cached value to me - there are probably existing constructs which would suit your needs better depending on what framework/type of app you're building. Rolling your own cache is hard.
Remember, there are only 2 hard problems in programming: naming, cache invalidation and off by one errors.