In short: Longint and Longword are fixed integers, the former are signed, the latter are unsigned and both are usually 32 bits. Their size depends on the platform in XE8, but a fixed size (32 bits) in XE7 and earlier versions.
The whole and cardinal are not fixed. These are the so-called "common" integers (do not confuse this with generics, which are another pair of shoes), i.e. They should preferably be used when an integral type is required, regardless of size. Depending on the version and platform, the size of Integer and Cardinal may vary. They currently have the same size and type as Longint and Longword.
Sizes of fixed sizes do not differ between versions or platforms. You should use these types where you should interact with code or data from sources other than your own program, in other words, where exact binary compatibility is important, for example. when calling API functions. Consequently, the use of types such as DWORD, etc.
Please note that current versions have aliases for types such as Byte or Smallint. These are Int8, UInt8, Int16, UInt16, etc. Before UInt64. ISTM that these names are easier to remember than, for example, “Smallint” (16 bits signed) or “Shortint” (8 bits signed).
Therefore, use Integer and Cardinal whenever possible, as they are probably ideal types for the platform and version. Use fixed-size types, such as Byte, Smallint, Longint, or UInt64, just to name a few when exact binary compatibility with other data is required.