When I said FIFO, I mean the philosophy of first-in-first-out, not a specific part of code that can be copied and pasted.
With the first-in-first-out request from the description, and with wr/rd enable, this design is literally a "FIFO" then.
storing valid signal into data buffer might work, only if the downstream logic accept this format. In some case, if the downstream logic demands continuous valid data for certain period(like within a frame/package), then you have to remove the invalid cycle in the data stream.
Again, this might not be what sun_ray is trying to achieve. But I remember sun_ray was asking some AXI design questions. And AXI is a protocol with handshake signals. In case he needs more information, the discussion might be helpful as well.