They're only empty in the initial example in that chapter. In the part you've quoted, it's using the tuple struct form to declare that the V4 variant must contain an Ipv4Addr. Listing 6-2 also shows that enum variants can be defined like named-field structs, but this is less common.
If you want it to be functional as a standalone type, then yes, define it on its own struct and then use that for the contents of the enum variant. Here you can directly pass around a value of Ipv4Addr, and it has its own methods and trait implementations, etc. If you never need that, then you can do it all directly in the enum.
(I vaguely recall some RFC automatically treating enum variants as a standalone type too.)