It's very simple, per Microsoft: "An lvalue refers to an object that persists beyond a single expression." Anything that is not an lvalue is an rvalue.
This isn't that much different that what I'm saying. although I've simplified it as much as possible, as is often done with an introductory-level course. On page 197 of K&R they say:
"An object is a named region of storage; a lvalue is an expression referring to the object."
Just a little further down, they use an assignment into variable j [the object] and say:
"That is, here j [the object] refers to the value stored at the memory location set aside for j..."
When first introducing the concept of a variable, I tell them to think of an lvalue as a memory address (i.e., "a named region of storage") and to think of an rvalue as what's stored at that address (i.e., "the value stored at the memory location"). K&R also state that data declarations are attribute lists without an lvalue (e.g., extern, function prototypes, etc.) while data definition are attribute lists with a known lvalue. Conceptually, I think this is a good way to introduce the concept to beginning students and it does make discussions about other C topics (extern, pointers, prototypes, etc.) much easier.
Obviously, we don't agree, so we'll just do the agree-to-disagree thing.