A few suggestions below, but none of them are related to your use of objects (which looks fine to me).
Obviously, your specific example is simple enough that derived types are not necessary. But in real codes with more variables, they really help to give some hierarchical structure and manage the complexity.
I suggest starting the module with:
module type_lm
implicit none
integer, parameter, public :: dp = SELECTED_REAL_KIND(15)
integer, parameter, public :: ip = SELECTED_INT_KIND(15)
and then replacing real(8) with real(dp), and integer(8) with integer(ip).
That is because in Fortran, compilers don’t have to use 8 to refer to 64-bit integers or reals (although a number of them do).
Also I suggest adding implicit none to the main program.
Because this example is small, IMO that’s fine. However as the setup complexity grows, you probably want to add a type-bound procedure to take care of those details, especially if you use many variables of type type_lm. Then you can just do, e.g., call type_lm_var%setup(1000000) in place of the 4 lines of code above.